8

好的,所以我有一个包含三列的表:

Id, Key, Value

我想删除所有Value为空('')的行。因此,我在删除之前编写了要选择的查询:

Select * from [Imaging.ImageTag] where [Value] = ''

到目前为止,一切都很标准......

现在这是奇怪的部分。此查询返回如下所示的两行,用逗号分隔列:

CE7C367C-5C4A-4531-9C8C-8F2A26B1B980,   ObjectType,  
F5B2F8A8-C4A8-4799-8824-E5FFEEDAB887,   Caption,    

为什么这两行匹配''

额外信息

我正在使用 Sql-Server,该[Value]列是类型NVARCHAR(300),是的,表名确实是[Imaging.ImageTag]

4

4 回答 4

10

这取决于排序规则。

匹配空字符串

SELECT 1 where N'' = N''  COLLATE latin1_general_ci_as

不匹配空字符串

SELECT 1 WHERE N'' = N''   COLLATE latin1_general_100_ci_as

100排序规则更加最新(尽管仍然不是最前沿的,它们自 2008 年以来就已经可用),除非您有特定的理由不这样做,否则您应该使用更现代的排序规则。100 个排序规则的 BOL 条目 专门调用

权重已添加到以前可以平等比较的非加权字符。

于 2017-11-29T11:31:36.387 回答
2

这不是您“为什么”的答案,但就您的总体目标而言,也许您应该改变搜索空值的策略:

Select * from [Imaging.ImageTag] where LEN([Value]) = 0

根据评论(感谢 Martin Smith 提供一些复制/粘贴的表情符号):

SELECT CASE WHEN N'' = N'' then 1 else 0 end --returns 1, no good for checking

SELECT LEN(N'') --returns 2, can be used to check for zero length values?
于 2017-11-29T11:26:07.923 回答
0

谷歌让我在这里寻找一种方法来过滤列上带有表情符号的所有行varchar。如果您正在寻找类似的东西:

SELECT mycolumn
FROM mytable
WHERE REGEXP_EXTRACT(mycolumn,'\x{1f600}')  <> ''
--sqlserver WHERE SUBSTRING(MyCol, (PATINDEX( '\x{1f600}', MyCol ))) <> ''

\x{1f600}是搜索到的表情符号的字符代码,您可以在此处找到表情符号代码

于 2019-09-29T21:24:25.567 回答
0

补充此答案当您需要在 sql 中使用“like”时

WHERE
N'' + COLUMNS like N'%'+ @WordSearch +'%' COLLATE latin1_general_100_ci_as 
于 2020-05-06T21:00:11.830 回答