【问题标题】:EXCEPT operator not working with foreign character set?除了不使用外来字符集的运算符?
【发布时间】:2015-01-13 01:13:46
【问题描述】:

我有两个 VIEW 需要使用 EXCEPT 运算符进行比较。目的是确定两个表的记录是否不同。问题在于可能包含外来字符集的一列(例如 fldIdentifierNo),当我使用 EXCEPT 运算符时,它似乎无法正确比较 fldIdentifierNo

这是我的查询,我还尝试将列显式转换为 NVARCHAR(MAX) 以确保它始终返回记录有差异,但无济于事。

SELECT 
    fldIdentifierNo  -- tried it also this way CONVERT(NVARCHAR(MAX),fldIdentifierNo)
FROM 
     this_is_the_view_local
WHERE 
    staff_no='00001'
EXCEPT
SELECT 
    fldIdentifierNo  -- tried it also this way CONVERT(NVARCHAR(MAX),fldIdentifierNo)
FROM 
    this_is_the_other_view
WHERE 
    staff_no='00001'                        

我比较的数据是这样的:

这是编辑器的实际结果:

已解决 在@T_G 和@VladimirBalanov 的帮助下,我发现其中一列上有“硬空间”,从而解决了这个问题。使用 LTRIM 和 RTRIM 不会删除硬空间。

我使用了 REPLACE 并将 CHAR(160) (nbsp) 的硬空间更改为 CHAR(32)(空格)。 替换(列名,CHAR(160),CHAR(32)

这是我的问题的解决方法,但更好我会检查为什么列上有这样的字符。

【问题讨论】:

  • 首先检查列值是否真的相同。在 SSMS 中查看查询结果可能会产生误导。尝试CONVERT(varbinary(8000), N'ChD/ЧД59121278') 并比较两个表的二进制结果。
  • @VladimirBaranov:看起来他们不一样。正如 T_G 所说,我的专栏中有一个空格。我尝试修剪空格,但仍有一列保留了值末尾的空格。你可能知道为什么会这样吗?
  • 真的是空格吗?检查二进制值,是0x20吗? LTRIM、RTRIM 只删除空格,它们不会删除其他不可打印的字符,如回车或制表符。
  • @VladimirBaranov 我解决了,列上有一个“硬空间”。我改用替换。最好检查一下为什么列上有硬空间。谢谢!
  • 请考虑重新发布您的决议作为答案(并接受它)。

标签: sql-server sql-server-2008


【解决方案1】:

请尝试:

SELECT 
    LTRIM (RTRIM (fldIdentifierNo)) COLLATE database_default
FROM 
     this_is_the_view_local
WHERE 
    staff_no='00001'
EXCEPT
SELECT 
    LTRIM (RTRIM (fldIdentifierNo))  COLLATE database_default
FROM 
    this_is_the_other_view
WHERE 
    staff_no='00001' 

【讨论】:

  • 可能有前导或尾随空格的区别?
  • 我修剪了列,还是一样。
  • 您能否更新您的观点并提供新信息:从视图 1 记录,然后从视图 2 记录,预期结果和获得的结果不是预期的结果?
  • 这是我正在运行的查询并消除了我的问题不需要的其他列。我发送的图像是我正在比较的实际列值。我将发布两个视图的实际结果。
【解决方案2】:

在@T_G 和@VladimirBalanov 的帮助下,我发现其中一列上有“硬空间”,从而解决了这个问题。使用 LTRIM 和 RTRIM 不会删除硬空间。

我使用了 REPLACE 并将 CHAR(160) (nbsp) 的硬空间更改为 CHAR(32)(空格)。替换(列名,CHAR(160),CHAR(32)

这是我的问题的解决方法,但更好的是我会检查为什么列上有这样的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 2011-02-07
    • 2018-02-20
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多