【问题标题】:MS SQL 2005 compare field containing square parenthesisMS SQL 2005 比较包含方括号的字段
【发布时间】:2009-02-02 15:52:35
【问题描述】:

我正在使用 MS SQL Server 2005 (9.0.4035) 并尝试在 nvarchar(4000) 字段中查找包含相同数据的行。该字段包含具有左方括号和右方括号的 xml。

这是示例数据:
数据ID 数据
1 1
2 1
3 2]
4 2]
5 3[
6 3[

使用“like”运算符,我希望得到 3 个匹配对,但我的问题是第 5 行和第 6 行不匹配,我只返回第 1 行和第 2 行匹配,第 3 行和第 4 行匹配。

我知道 MS SQL 2005 在查询中添加了正则表达式支持,但我没想到它们会将字段数据评估为正则表达式,我认为它正在这样做。是否需要启用某种模式才能获得正确的结果?

任何帮助表示赞赏,
瑞恩

编辑:添加使用的sql语句:

从 TestTable t1、TestTable t2 中选择 t1.DataID、t2.DataID
其中 t1.DataID t2.DataID
和 t1.Data 类似 t2.Data

编辑:回答
使用 '=' 运算符有效,但转义 '[' 无效。

【问题讨论】:

  • 您能否添加您尝试过的语句,以便我们更好地解决您的问题?

标签: sql sql-server sql-server-2005


【解决方案1】:

将您的查询更改为使用 = 而不是 LIKE,您将获得预期的结果。 SQL 2005 T-SQL 不会执行正则表达式——您需要为此使用 CLR 函数——但 LIKE 语句会执行模式匹配。 '[' 和 ']' 保留用于类似语句中的模式匹配,如果您打算让它们成为相等匹配,则必须将它们转义。

有关 LIKE 语句的信息,请参阅 http://msdn.microsoft.com/en-us/library/ms179859.aspx

以下 2 个查询中的任何一个都解决了我的测试中的问题...

--using equals operator...
Select t1.DataID, t2.DataID From TestTable t1, TestTable t2
Where t1.DataID <> t2.DataID
and t1.Data = t2.Data

--using replace to add an escape character.
Select t1.DataID, t2.DataID From TestTable t1, TestTable t2
Where t1.DataID <> t2.DataID
and t1.Data like REPLACE(t2.Data, '[', '\[') escape '\'

【讨论】:

  • 谢谢,Scott 使用 '=' 有效。我以为我之前尝试过,但那是在星期五下午,所以也许这就是问题所在。我之前也尝试过转义值(通过修改字段值),但没有这样的运气。使用替换来转义值也不会返回正确的结果。
  • 奇怪的是,转义对你不起作用 - 这两个查询都在我的 SQL 2005 标准开发盒上工作。
猜你喜欢
  • 2015-11-28
  • 2018-02-24
  • 2019-04-07
  • 2011-04-09
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多