【问题标题】:mssql compare two multiple values strings in where clausemssql比较where子句中的两个多值字符串
【发布时间】: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


【解决方案1】:

也许这可以帮助你:

select * from table1 where exists 
(select * from 
    (select val from dbo.split(table1.column,'|')) a,
    (select val from dbo.split(@variable,',')) b 
where a.val=b.val)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多