"খালি বা নাল মান" পরীক্ষা করার সর্বোত্তম উপায়


176

পোস্টগ্রিস স্কিল স্টেটমেন্টে মান নাল বা ফাঁকা স্ট্রিং কিনা তা যাচাই করার সর্বোত্তম উপায় কী?

মান দীর্ঘ অভিব্যক্তি হতে পারে তাই এটি কেবল একবার যাচাই করে একবার লেখা হয়।

বর্তমানে আমি ব্যবহার করছি:

coalesce( trim(stringexpression),'')=''

তবে দেখতে কিছুটা কুৎসিত লাগে।

stringexpressionপেছনের জায়গাগুলি সহ char(n)কলাম বা ভাব হতে পারে char(n)col

সবচেয়ে ভাল উপায় কি?


3
charপ্যাডিং (এবং ফলস্বরূপ স্থানের অপচয়) এর কারণে ব্যবহার প্রায়শই ভুল পছন্দ। তবে সেগুলি বাদে: আমি মনে করি না এর চেয়ে ভাল সমাধান আর আছে।
a_horse_with_no_name

কুৎসিত কেন? যৌক্তিক এবং সুগঠিত
ক্লিন

1
@ এ_হর্স_বিহীন_নাম_নাম: আমার মনে হয় সেখানে আছে।
এরউইন ব্র্যান্ডস্টেটার

উত্তর:


283

অভিব্যক্তি stringexpression = ''ফল দেয়:

TRUE   .. ''(অথবা যে কোনও স্ট্রিংয়ের জন্য কেবলমাত্র ডেটা টাইপ সহ ফাঁকা স্থান রয়েছে char(n))
NULL   .. জন্য NULL
FALSE .. অন্য কিছুর জন্য

সুতরাং যাচাই করার জন্য: " stringexpressionহয় নাল বা খালি" :

(stringexpression = '') IS NOT FALSE

বা বিপরীত পদ্ধতির (পড়তে সহজ হতে পারে):

(stringexpression <> '') IS NOT TRUE

সহ যে কোনও চরিত্রের জন্য কাজ করে char(n)তুলনা অপারেটর সম্পর্কে ম্যানুয়াল।

বা আপনার মূল ভাবটি ছাড়াই ব্যবহার করুন trim(), যা ব্যয়বহুল শব্দ char(n)(নীচে দেখুন), বা অন্য চরিত্রের ধরণের জন্য ভুল: কেবলমাত্র ফাঁকা স্ট্রিংগুলি খালি স্ট্রিং হিসাবে যেতে পারে।

coalesce(stringexpression, '') = ''

তবে শীর্ষে প্রকাশগুলি দ্রুত হয়।

বিপরীত যুক্ত করা এমনকি সহজ: " stringexpressionNUL বা খালিও নয়" :

stringexpression <> ''

সম্পর্কিত char(n)

এই ডাটা টাইপ সম্পর্কে char(n), সংক্ষিপ্ত জন্য: character(n)। ( char/ characterজন্য ছোট char(1)/ character(1)।) এর ব্যবহারের হয় Postgres মধ্যে নিরুৎসাহিত :

বেশিরভাগ পরিস্থিতিতে textবা character varyingপরিবর্তে ব্যবহার করা উচিত।

গুলান না char(n)অন্যান্য, দরকারী, চরিত্র ধরনের সঙ্গে varchar(n), varchar, textবা"char" (ডাবল-কোট দিয়ে)।

ইন char(n)একটি খালি স্ট্রিং অন্য কোন শুধুমাত্র শূণ্যস্থান গঠিত স্ট্রিং থেকে আলাদা নয়। প্রকারের সংজ্ঞা অনুসারে এগুলি সবগুলি n স্পেসে ভাঁজ করা হয় char(n)। এটি যৌক্তিকভাবে অনুসরণ করে যে উপরের মত প্রকাশগুলি char(n)পাশাপাশি কাজ করে - ঠিক তেমন এগুলি (যা অন্যান্য চরিত্রের ধরণের জন্য কাজ করে না):

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '

ডেমো

খালি স্ট্রিং যখন ফাঁকা হয় তখন কোনও স্ট্রিংয়ের সমান হয় char(n):

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

ফলাফল:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

"নাল বা ফাঁকা স্ট্রিং" এর জন্য পরীক্ষা করুন এর সাথে char(n):

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::char(5))
   , ('')
   , ('   ')                -- not different from '' in char(n)
   , (NULL)
   ) sub(stringexpression);

ফলাফল:

stringexpression | বেস_স্টেট | পরীক্ষা 1 | পরীক্ষা 2 | coalesce1 | coalesce2 | coalesce3
------------------ + + ----------- + + ------- + + ------- + + --- -------- + + ----------- + + -----------
 foo | চ | চ | চ | চ | চ | চ
                  | t | t | t | t | t | টি
                  | t | t | t | t | t | টি
 নাল              | নাল       | t | t | t | t | টি

"নাল বা ফাঁকা স্ট্রিং" এর জন্য পরীক্ষা করুন এর সাথে text:

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::text)
   , ('')
   , ('   ')                -- different from '' in a sane character types
   , (NULL)
   ) sub(stringexpression);

ফলাফল:

stringexpression | বেস_স্টেট | পরীক্ষা 1 | পরীক্ষা 2 | coalesce1 | coalesce2 | coalesce3
------------------ + + ----------- + + ------- + + ------- + + --- -------- + + ----------- + + -----------
 foo | চ | চ | চ | চ | চ | চ
                  | t | t | t | t | চ | চ
                  | চ | চ | চ | চ | চ | চ
 নাল              | নাল       | t | t | t | t | চ

ডিবি <> ফ্রিডল এখানে
পুরাতন স্ক্যালফিল্ড

সম্পর্কিত:


2
@a_horse_with_no_name: ওপি জন্য অনুরোধ best way to check if value is null or empty stringtrim()এবং মাত্র প্রয়োজনীয় না - কল (তুলনামূলকভাবে) ব্যয়বহুল। আমি char(n)"খালি স্ট্রিং" সম্পর্কে আরও যুক্ত করেছি ।
এরউইন ব্র্যান্ডস্টেটার

1
আপনি লিখেছেন যে যে কোনও স্ট্রিং এক্সপ্রেশনটি কেবল ফাঁকা স্থান রয়েছে সমান ''। আমি কি ছাঁটা মুছে ফেলতে পারি এবং coalesce(stringexpression,'')=''যাচাই করতে ব্যবহার করতে পারি । আপনার উত্তরের তুলনায় এটি আমার কাছে আরও পঠনযোগ্য বলে মনে হচ্ছে।
অ্যান্ড্রুস

1
@ এন্ড্রাস: হ্যাঁ, আপনি পারেন। আমি উত্তরটিতে আরও কিছু যুক্ত করেছি।
এরউইন ব্র্যান্ডস্টেটার

3
select coalesce(' ', '') = '' মিথ্যা প্রত্যাবর্তন সুতরাং ট্রিম () আবশ্যক
অ্যান্ড্রুস

1
কিন্তু coalesce(' '::char(5), '') = ''না। আমি যে কোনও ক্ষেত্রে শীর্ষ দুটি এক্সপ্রেশনগুলির মধ্যে একটি ব্যবহার করব, যা কোনও চরিত্রের ধরণের জন্য কাজ করে এবং দ্রুত এবং পরিষ্কার হয় are
এরউইন ব্র্যান্ডস্টেটার

46

নাল এবং খালি পরীক্ষা করার জন্য:

coalesce(string, '') = ''

নাল, খালি এবং ফাঁকা স্থান অনুসন্ধান (স্ট্রিং ছাঁটা)

coalesce(TRIM(string), '') = ''

3
আমি এই উত্তরটির সরলতা / স্পষ্টতা পছন্দ করি।
stwr667

12

স্ট্রিংয়ের দৈর্ঘ্যের জন্য অনুসন্ধান করাও কাজ করে এবং কমপ্যাক্ট:

where length(stringexpression) > 0;

আপনি কি নুল মামলার জন্য এটি পরীক্ষা করেছেন?
ফ্লিন্স

1
হ্যা, আমি করেছিলাম. এটি খালি বা নাল স্ট্রিংয়ের ক্ষেত্রগুলিতে ফিরে আসে না।
yglodt

আপনার যদি কেবল খালি মানগুলি পরীক্ষা করতে হয় তবে এটি চেষ্টা করুন -> where length(stringexpression) = 0;। এটি আমার পক্ষে কাজ করে।
কুশান গুণসেকের

2

যদি খালি পিছনে স্থান থাকতে পারে তবে সম্ভবত এর থেকে ভাল সমাধান আর নেই। COALESCEশুধুমাত্র আপনার মত সমস্যার জন্য।


1

লোকেরা ব্যবহার করতে দেখেছি এমন কিছু stringexpression > ''। এটি দ্রুততম নাও হতে পারে তবে সংক্ষিপ্ততমগুলির মধ্যে একটি হতে পারে।

এটি এমএস এসকিউএল-এর পাশাপাশি পোস্টগ্রিসএসকিউএলে চেষ্টা করেছেন।



0

নালাইযোগ্য ক্ষেত্রগুলির তুলনা করার জন্য আমার প্রিফার্ড পদ্ধতিটি হ'ল: নুলিফ (নলফিল্ডফিল্ড:: প্যারামিটারভ্যালু) হ'ল নাল এবং নুলিফ (: প্যারামিটারভ্যালু, নলেবলফিল্ড) হ'ল নাল। এটি জটিল, তবে সর্বজনীন ব্যবহারের ক্ষেত্রে যখন কোলেসেস কিছু ক্ষেত্রে অসম্ভব।

নুলিফের দ্বিতীয় এবং বিপরীতমুখী ব্যবহার হ'ল কারণ প্রথম পরামিতিটি শূন্য থাকলে "NULLIF (nullablefield,: ParameterValue) IS NULL" সর্বদা "সত্য" ফিরে আসবে।


0

যদি ডাটাবেসে প্রচুর রেকর্ড থাকে তবে null checkআপনি আরও বিভিন্ন সময় নাল চেক ব্যবহার করতে পারেন যেমন: 1) where columnname is null 2) where not exists() 3)WHERE (case when columnname is null then true end)


0

উত্তরগুলির অনেকগুলি সংক্ষিপ্ততম উপায়, কলামটিতে প্রচুর শূন্যপদ থাকলে অগত্যা সর্বোত্তম উপায় নয়। চেক আপ ভাঙ্গা অপ্টিমাইজারটিকে চেকটিকে দ্রুত মূল্যায়ন করতে দেয় কারণ এটি অন্য শর্তে কাজ করতে হয় না।

(stringexpression IS NOT NULL AND trim(stringexpression) != '')

প্রথম শর্তটি মিথ্যা হওয়ায় স্ট্রিং তুলনা মূল্যায়নের প্রয়োজন হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.