用于检查空字符串的SQL语句 - T-SQL

时间:2017-02-19 19:15:43

标签: sql sql-server

我正在尝试为某个字符串变量不为null或为空的地方写一个WHERE子句。我遇到的问题是某些非空字符串等于N''字面值。例如:

declare @str nvarchar(max) = N'㴆';
select case when @str = N'' then 1 else 0 end;

收益1.从我在Wikipedia收集的内容来看,这个特殊的unicode字符是用于淹没某些东西的象形图,它在语义上不等于空字符串。此外,字符串长度为1,至少在T-SQL中。

是否有更好(准确)的方法来检查空字符串的T-SQL变量?

1 个答案:

答案 0 :(得分:6)

我找到了一个博客https://bbzippo.wordpress.com/2013/09/10/sql-server-collations-and-string-comparison-issues/

解释了

  

问题是因为“默认”排序规则设置   (SQL_Latin1_General_CP1_CI_AS)对于SQL Server无法正常比较   包含所谓的补充字符的Unicode字符串   (4字节字符)。

修复是使用没有补充字符问题的排序规则。例如:

select case when N'㴆' COLLATE Latin1_General_100_CI_AS_KS_WS = N'' then 1 else 0 end;

将返回0.有关更多示例,请参阅博客。

由于您要与空字符串进行比较,因此另一种解决方案是测试字符串长度。

declare @str1 nvarchar(max) =N'㴆';
select case when len(@str1) = 0 then 1 else 0 end;

这将按预期返回0。

当字符串为空时,这也会产生0。

修改

感谢devio的评论,我深入挖掘并发现了Erland Sommarskog的评论https://groups.google.com/forum/#!topic/microsoft.public.sqlserver.server/X8UhQaP9KF0

除了不支持补充字符外,Latin1_General_CP1_CI_AS排序规则不能正确处理新的Unicode字符。所以我猜测㴆字符是一个新的Unicode字符。

指定排序规则Latin1_General_100_CI_AS也可以解决此问题。