ms sql server字符串与另一个具有多个值的字符串进行比较

Posted

技术标签:

【中文标题】ms sql server字符串与另一个具有多个值的字符串进行比较【英文标题】:ms sql server string compare to another string with multiple value 【发布时间】:2014-03-08 14:25:50 【问题描述】:

MS SQL Server Input Column 1 Cat 1 包含多个用空格分隔的值,Cat2 包含要比较的值。如果 Cat2 值与 Cat1 中的任何一个值匹配,则所需的输出列应为 1,如果不匹配,则应为 0。分隔符是一个空格。类似 -- answer = 1 if Cat1=In (cat2) 后用逗号替换空格,但我不明白完成此操作的语法。谁能帮我解决这个问题。提前致谢。

DECLARE @TABLE TABLE(Cat1 VARCHAR(50),Cat2 VARCHAR(50), answer VARCHAR(50))
INSERT INTO @TABLE VALUES
('3 4 6 36 a b','36','1'),
('5 4 6 36 a b','3','0'),
('7 5 6 46 a b','4','0'),
('7 5 6 46 a b','5','1'),
('3 4 6 36 a b','7','0')
select cat1, cat2 , answer
FROM @TABLE

Cat1                        Cat2             output
3 4 6 36 a b                 36                 1
3 4 6 36 a b                 3                  1 
3 4 6 36 a b                 4                  1
3 4 6 36 a b                 7                  0  

开发

【问题讨论】:

抱歉 - 表格的格式搞砸了。 样本数据缺少 Cat1 = "8 4 6 36 a b"、Cat2 = "3" 和 OUTPUT = "0" 的测试用例。解决方案不应允许仅“3”匹配“36”中的“3”的情况,这不是有效匹配。 【参考方案1】:

SQL Fiddle

MS SQL Server 2008 架构设置

CREATE TABLE Test_Table(Cat1 VARCHAR(50),Cat2 VARCHAR(50))
INSERT INTO Test_Table VALUES
('3 4 6 36 a b','36'),
('3 4 6 36 a b','3'),
('3 4 6 36 a b','4'),
('3 4 6 36 a b','7'),
('8 4 6 36 a b','b')

查询 1

SELECT *
      ,CASE WHEN  Cat1  LIKE '% '+ Cat2
            OR    Cat1  LIKE '% '+ Cat2+ ' %'
            OR    Cat1  LIKE       Cat2+ ' %'
              THEN 1
         ELSE 0 
       END AS [OUTPUT]
FROM Test_Table 

Results

|         CAT1 | CAT2 | OUTPUT |
|--------------|------|--------|
| 3 4 6 36 a b |   36 |      1 |
| 3 4 6 36 a b |    3 |      1 |
| 3 4 6 36 a b |    4 |      1 |
| 3 4 6 36 a b |    7 |      0 |
| 8 4 6 36 a b |    b |      1 |

【讨论】:

在您将空格分隔符添加到 3 个 LIKE 条件中的每一个的“%”中之前,此解决方案实际上不会起作用。第一个条件是 '%' + Cat2,最后一个条件是 Cat2 + '%',中间条件包括这两个变化。如果没有这个,只有“3”的测试用例将匹配“36”中的“3”,但这不是一个有效的匹配。样本数据缺少 Cat1 = "8 4 6 36 a b"、Cat2 = "3" 和 OUTPUT = "0" 的测试用例。 @srutzky 感谢您指出这一点,我已经解决了这个问题 :) 非常感谢。 非常感谢 srutzky 能够正确识别问题,即使它(我)解释得不好,也非常感谢我把它变成一张桌子和 M. ali 回答它。你是最棒的! 没问题,很高兴它有帮助:) 是的 - 确实缺少我添加的几个测试用例

以上是关于ms sql server字符串与另一个具有多个值的字符串进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个字段中的日期与另一字段中的时间结合起来 - MS SQL Server

将一个表中的多个值与另一个表中的多个值进行比较

SQL Server,将列中的所有值与另一个值的一些值连接起来

具有集成安全 PHP 和 MS SQL Server 的 ODBC 连接

SQL Server 更新语句基于具有多个值的 Select 语句

MS SQL Server 位列导出为布尔值