我想检查数据,但如果它为空或空忽略它。目前查询如下…
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
但我想找个伴。OfferText如果列表。Offertext是一个空字符串,如果它是null。
最好的解决方案是什么?
SELECT
CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText
ELSE COALESCE(Company.OfferText, '') END
AS Offer_Text,
...
在本例中,使用if列表。OfferText是NULL, LEN()函数也应该返回NULL,但这仍然不是> 0。
更新
在发布这篇文章后的5年半里,我学到了一些东西,现在做得很不同:
COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')
这与公认的答案类似,但它也有一个备用方案。OfferText也是null。使用NULLIF()的其他当前答案也不这样做。
使用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
在处理VARCHAR/NVARCHAR数据时,大多数其他示例将空白视为空字符串,这等于c#函数IsNullOrWhiteSpace。
这个版本尊重空白,工作原理与c#函数IsNullOrEmpty相同:
IIF(ISNULL(DATALENGTH(val), 0) = 0, whenTrueValue, whenFalseValue)
简单的测试:
SELECT
'"' + val + '"' AS [StrValue],
IIF(ISNULL(DATALENGTH(val), 0) = 0, 'TRUE', 'FALSE') AS IsNullOrEmpty
FROM ( VALUES
(NULL),
(''),
(' '),
('a'),
('a ')
) S (val)