我在尝试基于sql中的LIKE匹配删除一行数据时遇到问题。我正在使用SQL Server 2005。
我有一个表(@Containers),其中包含如下信息: -
PMBID DEPT
------ ---------
248057 5,8
249799 5,6,8
249800 5
249941 1,5
249942 1,4,15,16
249943 1,4,5
249945 4
249946 4
249947 4
249966 8,16,23
249967 5,6,8,16
两列都是字符串,我需要一个查询才能根据部门删除行,例如,如果PMBID有部门1,11,23或31,则需要从表中删除它。所以用这个逻辑PMBID的......
249941
249942
249943
249966
将被移除。
那么我如何在SQL中这样做(好),因为我的列是字符串?
我一直在编写诸如......之类的查询。
DELETE FROM @Containers WHERE (Dept LIKE '%1%' OR Dept LIKE '%11%' OR Dept LIKE '%23%' OR Dept LIKE '%31%')
显然这句话不起作用,因为它捕获了像15和16这样的部门,所以例如PMBID
249967
当不应时会包含,因为它不是明确的1,11,23或31(或这些的组合)。
这是否可以使用字符串列?我们可以以某种方式使用分隔符来改进查询吗?
我现在停止作为过度复杂查询的风险,如果您需要任何进一步的信息,请告诉我。
答案 0 :(得分:4)
列表中的逗号搜索问题。在DEPT
周围放置逗号并围绕字符串中的值:
DELETE FROM @Containers
WHERE (','+Dept+',' LIKE '%,1,%' OR
','+Dept+',' LIKE '%,11,%' OR
','+Dept+',' LIKE '%,23,%' OR
','+Dept+',' LIKE '%,31,%')
答案 1 :(得分:1)
将数据存储在逗号分隔的字符串中是不好的做法,但这对于部门1来说是一个例子:
DELETE FROM @Containers
WHERE Dept LIKE '%,1'
OR Dept LIKE '1,%'
OR Dept LIKE '%,1,%'
你必须强制逗号进入标准,以便从捕获11中排除1,依此类推。
答案 2 :(得分:0)
使用将字符串拆分为单个值的函数可能更清晰。
这里有一篇关于这个主题的好文章:
http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings