SQL字符串与EXCEPT的相等性比较

时间:2014-08-07 13:23:23

标签: sql sql-server sql-server-2008-r2

我刚刚意识到我写过的几个触发器存在问题,可以通过此查询来演示:

SELECT CASE WHEN 'TEST' = 'TEST ' THEN 'y' ELSE 'n' END

虽然您可能认为这解析为N,但实际上它解析为Y,因为SQL Server会在比较它们之前修剪字符串的尾随空格。

一个建议似乎是使用like,这在where子句中很好:

SELECT CASE WHEN 'TEST' LIKE 'TEST ' THEN 'y' ELSE 'n' END确实解决了你想要的问题。

另一个建议是使用`DATALENGTH:

检查长度

SELECT CASE WHEN 'TEST' = 'TEST ' AND DATALENGTH('TEST') = DATALENGTH('TEST ') THEN 'y' ELSE 'n' END

不幸的是,这会在我用来更新另一个表的触发器中造成额外的复杂性:

SELECT
    FullName COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableA
EXCEPT
SELECT
    FullName COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableB

然后变为:

SELECT
    FullName COLLATE SQL_Latin1_General_CP1_CS_AS,
    FullName_Length = DATALENGTH(FullName)
FROM TableA
EXCEPT
SELECT
    FullName COLLATE SQL_Latin1_General_CP1_CS_AS,
    FullName_Length = DATALENGTH(FullName)
FROM TableB

有更简单的方法吗?有什么方法我可以告诉EXCEPT比较字符串,包括它们的长度,而不是通过修剪尾随字符?

如果以前曾经问过这个道歉,我发现EXCEPT找不到任何东西我都不是很幸运。

1 个答案:

答案 0 :(得分:3)

嗯,你可以在最后添加一些东西

SELECT 
      CASE WHEN CONCAT('TEST', 'ADummyValue') = 
             CONCAT('TEST      ', 'ADummyValue') THEN 'y' ELSE 'n' END


SELECT
    CONCAT(FullName, 'ADummyValue') AS FullName COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableA
EXCEPT
SELECT
    CONCAT(FullName, 'ADummyValue') COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableB

使用REVERSE

SELECT
    REVERSE(FullName) AS FullName COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableA
EXCEPT
SELECT
    REVERSE(FullName) COLLATE SQL_Latin1_General_CP1_CS_AS
FROM TableB