2017-02-19 61 views
4

我想写一个WHERE子句,用于某个字符串变量不为空或空的位置。我遇到的问题是某些非空字符串等于N''文字。例如:用于检查空字符串的SQL语句 - T-SQL

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

息率1。从我可以收集Wikipedia,这个特殊的Unicode字符是淹没的东西,这不是语义上等于一个空字符串象形文字。此外,字符串长度为1,至少在T-SQL中。

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

+0

“无值”条目应为“NULL”。然后真的很容易检查:'@str不为空...' –

+0

该应用程序的问题是使用'NULL'来表示“不要修改此字段”和“N''表示”将此值更新为NULL ”。该设计是故意的,以便不需要修改的字段可以从数据修改消息中省略。 –

+0

您的意思是:检查nvarchar的值是否为ANSI STD? – McNets

回答

6

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

对此解释称

的问题是,因为“默认”排序规则设置 (SQL_Latin1_General_CP1_CI_AS) for 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的评论,我挖了一个深一点,发现从厄兰Sommarskog https://groups.google.com/forum/#!topic/microsoft.public.sqlserver.server/X8UhQaP9KF0

,除了不支持增补字符,则Latin1_General_CP1_CI_AS整理不处理评论新的Unicode字符正确。所以我猜测㴆字符是一个新的Unicode字符。

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

+1

您对排序规则是正确的,但'select DATALENGTH(@str)'返回2,CAST AS VARBINARY给出'U + 3D06',因此不是补充字符。 – devio

0

如果我理解正确你:

Select ...... 
where isnull(yourfield,'') != '' 
+1

这通常可以正常工作,但是在这种情况下,OP有一个unicode字符,默认排序规则无法识别并且测试失败。 – DeanOC