【发布时间】:2015-08-04 11:53:15
【问题描述】:
我想比较两个多值字符串,看看其中一个值是否存在于另一个字符串中。
我有一个带有 nvarchar 行的表,其中包含管道分隔值,例如
'value1|value2|value3'
我还有一个带有逗号分隔字符串的 nvarchar 变量,例如
'value2,value3'
直到现在表中的列只有一个值,我使用表函数将字符串吐出变量中并使用IN子句查看该值是否在生成的表中。例如
select * from table1
WHERE column in (select val from dbo.split(@variable,','))
如果该列还包含更多值,这将不起作用。
select * from table1
WHERE (select val from dbo.split(column,'|')) in (select val from dbo.split(@variable,','))
在这里,它尝试将 2 个生成的表相互比较,但失败了。我已经尝试过使用连接,但找不到正确执行此操作的方法。我正在使用 MSSQL 2008R2
【问题讨论】:
-
这是非常糟糕的数据库设计,将值存储为 CSV 或管道分隔值。您应该了解标准化。
-
你真的应该重新考虑你的数据库设计。在 99.99999% 的情况下,单列中的分隔值是错误的。
-
如果存在将其从分隔列表更改为规范化表的选项,请立即执行;这是痛苦的第一口。
-
我希望我可以,这是一个我无法更改任何内容的应用程序数据库。我不拥有代码。在这种情况下,我无法更改应用程序的行为。
-
那么对于变量中的 each 标记,您必须对分解的列运行
IN ()测试(使用预先创建的临时表/var)
标签: sql-server sql-server-2008 where-clause string-comparison multiple-value