2008-12-02 93 views
184

我想檢查數據,但如果數據爲空或空則忽略它。目前查詢是如下...如何檢查Sql服務器字符串是否爲空或空

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  

但我想如果company.OfferText是listing.Offertext一個空字符串,以及它是否爲空。

什麼是表現最佳的解決方案?

回答

333

我認爲這是:

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

我無法決定是否應該upvote您的答案或unclefofa的,因爲他似乎已經回答了第一,但他的答案已經編輯後,你的回答。 我結束了兩個表決。 – Zecc 2011-03-22 10:04:57

+0

如果listing.Offer_Text ='',它傳遞NULLIF條件。我很傷心。 – Merritt 2012-11-09 23:16:31

+0

只要company.Offer_Text不爲空,但這會使事情複雜化...... =) – Coops 2013-01-03 12:38:47

30
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, '') 

這與接受的ans但如果Company.OfferText也爲空,它也有一個回退。目前沒有其他使用NULLIF()的答案也可以做到這一點。

+0

這讓upvoted今天,所以它的某處索引。我現在知道比原來的答案更好的方法來做到這一點。 – 2015-03-18 21:46:19

32
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 
11

您可以使用ISNULL,檢查答案對比已知輸出:

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

這裏有一個解決辦法,但我不知道這是否是最好的....

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 
16

這是另一種解決方案:

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 
1

爲了防止記錄在SQL結果EmptyNull

,我們可以簡單地添加..... WHERE Column_name != '' or 'null'

2
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 
2

此語法:

SELECT * 
FROM tbl_directorylisting listing 
WHERE (civilite_etudiant IS NULL) 

在Microsoft SQL Server 2008(SP3)

3
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 
9

爲我工作在SQL Server 2012中你有IIF,例如,你可以使用它像

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

您可以檢查是否領域用同樣的方法是空的。

4

使用LEN函數檢查空值或空值。您可以使用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 
3

這個簡單的COALESCE和NULLIF的組合應該做的伎倆:

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

注:添加另一個空字符串作爲最後一個COALESCE參數,如果你希望語句返回一個空字符串而不是NULL,如果兩個值都是NULL。

0
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0 
0

我知道這是一箇舊線程,但我剛剛看到上面的一篇帖子,它不正確。如果您正在使用LEN(),以確定是否申請是null或空,那麼你需要如下使用它:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue... 
相關問題