比较Varchars和尾随空格时如何在SQL Server中使用IN条件?

时间:2018-11-08 13:24:18

标签: sql-server sql-server-2008

以下是问题的一个示例:

SELECT 'True'
WHERE 'Hello      ' IN ('Hello', 'Goodbye', 'Hello  ')

当前返回“ True”,因为在比较VARCHAR时SQL会忽略尾随空格。在this related question中,可以使用LIKE解决此问题,但是在IN条件下无法使用。

在使用IN条件时,如何确保比较考虑到尾随空格, 具体

编辑: 我的可接受值列表可以包含带尾随空格的项目。希望从本质上比较精确值(即“ Hello”与“ Hello”不匹配)

3 个答案:

答案 0 :(得分:2)

假设您的可接受值列表没有尾随空格,也许您可​​以使用:

SELECT 'True'
WHERE 'Hello      ' IN ('Hello', 'Goodbye') AND 'Hello      ' NOT LIKE '% '

答案 1 :(得分:1)

您可以在搜索项目的末尾添加一个非空格字符:

DECLARE @Terminator char(1) = '|';

SELECT 'True'
WHERE 'Hello      ' + @Terminator  IN ('Hello' + @Terminator , 'Goodbye' + @Terminator)

这将迫使比较在将所有内容保持可区分的同时考虑尾随空格。 (我假设您想在IN运算符的左侧或右侧使用列)

答案 2 :(得分:1)

我可以想到这个解决方案:

SELECT 'True'
WHERE reverse('Hello      ') IN (reverse('Hello'), reverse('Goodbye'))

基本上,这会强制使用reverse函数比较字符串。

但是Zohar下面的解决方案是大多数性能驱动的解决方案。

SELECT 'True'
WHERE 'Hello      '+'|' IN ('Hello'+'|', 'Goodbye'+'|')