我想检查数据,但如果数据为空或为空则忽略它。目前查询如下...
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.OfferTex
是一个空字符串,以及它是否为空,我想得到 listing.Offertext
t。
性能最佳的解决方案是什么?
我认为:
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;
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 1/2 的时间里学到了一些东西,现在的做法有很大不同:
COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')
这与已接受的答案类似,但它也有一个后备方案,以防
Company.OfferText
也为空。当前使用 NULLIF()
的其他答案都没有这样做。
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
这是另一种解决方案:
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
您可以使用
ISNULL
并根据已知输出检查答案:
SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST
在 SQL Server 2012 中,您有
IIF
,例如,您可以像 一样使用它
SELECT IIF(field IS NULL, 1, 0) AS IsNull
以同样的方式检查字段是否为空。
使用 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 还是 EMPTY 那么您需要按如下方式使用它:
...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
这个语法:
SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)
在 Microsoft SQL Server 2008 (SP3) 中为我工作
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
COALESCE 和 NULLIF 的简单组合应该可以解决问题:
SELECT
Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...
注意:如果您希望语句在两个值都为 NULL 时返回空字符串而不是 NULL,请添加另一个空字符串作为最后一个 COALESCE 参数。
这是一个解决方案,但我不知道这是否是最好的......
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
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 或空,请使用以下命令:
IF LEN(ISNULL(@var, '')) = 0
-- Is empty or NULL
ELSE
-- Is not empty and is not NULL
防止SQL结果中出现带有
Empty
或Null
值的记录
我们可以简单地添加
..... WHERE Column_name != '' or 'null'
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
[Column_name] > ' ' 排除 Null 和空字符串。单引号之间有一个空格。
在处理
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)
这也适合空间。
(len(rtrim(ltrim(isnull(MyField,'')))) !=0