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 连接