SQLサーバー文字列がnullまたは空かどうかを確認するにはどうすればよいですか?


225

データをチェックしたいのですが、nullまたは空の場合は無視します。現在、クエリは次のとおりです...

Select              
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id      

しかし、空の文字列の場合やnullのcompany.OfferTex場合listing.Offertextはt を取得します。

最高のパフォーマンスのソリューションは何ですか?

回答:


433

私はこれを考えます:

SELECT 
  ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...

最もエレガントなソリューションです。

そして、それを疑似コードで少し分解するには:

// a) NULLIF:
if (listing.Offer_Text == '')
  temp := null;
else
  temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
  result := true;
else
  result := false;

1
最初に回答したように思われるため、私はあなたの回答またはアンクレフォファのどちらに賛成するべきかを決定できませんでしたが、あなたの回答後に彼の回答が編集されました。私は両方を賛成した。
Zecc、2011年

listing.Offer_Text = ''の場合、NULLIF条件を渡します。私は困惑しています。
メリット

company.Offer_Textがnullでない限り、これにより状況が複雑になります... =)
Coops

3
私たちは、必ずすべてが計画通りに行く作るためにトリミング使用しないでください
irfandar

5
@irfandar-まあ、すべてのスペースが空の文字列を扱いたい場合は、trimを使用してください。それ以外の場合、すべてスペースを含む文字列は空ではありません。
Martin Ba

53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

この例では、listing.OfferTextがNULLの場合、LEN()関数もNULLを返す必要がありますが、それでも> 0ではありません。

更新

これを投稿してから5年半の間にいくつかのことを学びましたが、今ではそれとは大きく異なります。

COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

これは受け入れられた回答に似ていますが、Company.OfferTextnullの場合のフォールバックもあります。を使用した他の現在の回答でNULLIF()はこれも行われません。


これは今日賛成されたので、どこかに索引付けされています。これを行うには、元の答えよりも良い方法を知っています。
Joel Coehoorn、2015年

34
Select              
CASE
    WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
    ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

18

ここに別の解決策があります:

SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, 
FROM   tbl_directorylisting listing 
       INNER JOIN tbl_companymaster company 
         ON listing.company_id = company.company_id

14

ISNULL既知の出力に対して回答を使用して確認できます。

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST

12

SQL Server 2012 IIFでは、たとえば、次のように使用できます。

SELECT IIF(field IS NULL, 1, 0) AS IsNull

フィールドが空かどうかを確認できるのと同じ方法です。


6

LEN関数を使用して、nullまたは空の値を確認します。LEN(@SomeVarcharParm)> 0を使用できます。値がNULL、 ''、または ''の場合、これはfalseを返します。これは、LEN(NULL)がNULLを返し、NULL> 0がfalseを返すためです。また、LEN( '')は0を返します。実行してみてください。

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END

「... LEN(NULL)はNULLを返し、NULL> 0はfalseを返します...」と言う場合、真のルールは、すべてのテストまたはNULLとの比較がNULLを返すということです。
Didier68 2016

これは注目に値しますが、比較によりnullが正しいブール値に合体するため、これはショートカットとして機能します。nullまたは空に対してtrueを返したい場合、これはLEN(NULL)= 0の逆比較には機能しません。 。
ザックジョンソン

4
Select              
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

プラス1(最初の回答(5年後))は、両方を使用NULLIF()し、company.OfferTextがnullの場合は空の文字列に合体します。ただし、NULLIF()ここでの2番目の呼び出しは何の役にも立ちません。あたかも値が空の文字列であるとしても、とにかく空の文字列に合体するだけのようです。
Joel Coehoorn、2015年

4

COALESCEとNULLIFのこの単純な組み合わせでうまくいくはずです。

SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

注:両方の値がNULLの場合にステートメントがNULLではなく空の文字列を返すようにするには、最後のCOALESCE引数として別の空の文字列を追加します。


4

私はこれが古いスレッドであることを知っていますが、上記の以前の投稿の1つを見ただけで、正しくありません。

使用している場合はLENを(...)フィールドがあるかどうかを判断するためにNULLまたは空その後、あなたは次のようにそれを使用する必要があります。

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...

3

ここに解決策がありますが、それが最高かどうかはわかりません...

Select              
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

3
SELECT              
    COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text,         
FROM 
    tbl_directorylisting listing  
    INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id

3

この構文:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

Microsoft SQL Server 2008(SP3)で私のために働いた


2

SQL結果の値EmptyまたはNullSQL結果のレコードを防止するには

簡単に追加できます ..... WHERE Column_name != '' or 'null'


これは最初の呼び出しポートですが、たとえばテーブルの複数の列から連結するようなことをしている場合、これはその列の空白を表示するだけでなく、行を除外します
Coops


0

[Column_name]> ''はNullと空の文字列を除外します。一重引用符の間にスペースがあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.