【问题标题】:SQL Doesnt Want to match strings with spaces for some reason由于某种原因,SQL 不想用空格匹配字符串
【发布时间】:2013-02-04 21:30:22
【问题描述】:

我的这个 SQL 查询没有正确比较,所以我在 WHERE 子句中注释掉了它。返回 AF.ActivityNote 时,无论我是否对其进行 RTRIM,它后面总是有 2 个空格。我认为这些空格是不允许注释的 WHERE 子句正确匹配字符串与 userfield33 的问题。

  SELECT CAST(UF.UserField33 AS NVARCHAR) , RTRIM(CAST(AF.ActivityNote AS NVARCHAR))
        FROM [BCMTEST01].[dbo].[ActivityContacts] as AC INNER JOIN [BCMTEST01].[dbo].[ActivityFullView] as AF
            ON AC.ActivityID = AF.ActivityID INNER JOIN [BCMTEST01].[dbo].[OpportunityExportView] as OP
            ON AC.ContactID = OP.ContactServiceID INNER JOIN [BCMTEST01].[dbo].[UserFields] as UF
            ON OP.ContactServiceID = UF.ContactServiceID
            WHERE ContactID = 8376
        --WHERE  RTRIM(CAST(UF.UserField33 AS NVARCHAR) = RTRIM(CAST(AF.ActivityNote AS NVARCHAR))
        ORDER BY ContactID ASC

【问题讨论】:

  • 你确定刺痛有空格吗?如果它们没有被 RTRIM() 删除,很可能它们实际上是一些其他(“不可打印”)字符。尝试一些以十六进制显示字符串的函数,或者在调试器中检查它,以确定。

标签: sql


【解决方案1】:

首先,您应该始终在转换为nvarcharvarcharcharnchar 时包含长度。所以使用类似的东西:

cast(uf.userfield33 as nvarchar(255)) -- or whatever length you like, so long as you have something

最后两个字符不是空格。执行以下操作:

select ascii(right( AF.ActivityNote, 1))

查看字符值是什么。然后,您可以使用replace 摆脱它。或者,您可以去掉最后两个字符(如果这适用于您的应用程序)。

顺便说一句,我假设您使用的是基于查询语法的 SQL Server。

这是一个替代的where 子句:

where (case when right(AF.ActivityNote, 2) = char(10)+CHar(13)
            then LEFT(AF.ActivityNote, LEN(AF.ActivityNote) - 2)
            else AF.ActivityNote
       end) = CAST(UF.UserField33 AS NVARCHAR(255)

我不喜欢 where 子句中的 case 语句。我实际上会将逻辑放在子查询中。另外,我可能会将 10/13 的顺序倒过来。

【讨论】:

  • 是的 sql 在服务器上。 ASCII 返回值 10。我无法替换,因为它将替换 ASCII10 的所有实例,但我将如何只替换尾随的实例?
  • @PaShKa 。 . .它们都是 ASCII 10 还是一个 ASCII 10 和另一个 ASCII 13? (好 ole ASCII 回车/换行。)
  • Gordon 成功了,只需要切换 char(10) 和 char(13) 的位置.. 它的 char(13) + char(10)
猜你喜欢
  • 2022-08-19
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2021-07-23
相关资源
最近更新 更多