Sql 通过使用LIKE查询删除一列数据(字符串),必须有更好的方法

Sql 通过使用LIKE查询删除一列数据(字符串),必须有更好的方法,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我在尝试基于sql中的相似匹配删除一行数据时遇到问题。我正在使用SQLServer2005 我有一个表@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 这

我在尝试基于sql中的相似匹配删除一行数据时遇到问题。我正在使用SQLServer2005

我有一个表@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
将被删除

既然我的列是string,那么如何在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或这些的组合

使用字符串列是否可以执行此操作?我们能否以某种方式使用分隔符来改进查询


我现在停止,因为有可能会使查询过于复杂,如果您需要任何进一步的信息,请告诉我。

将数据存储在逗号分隔的字符串中是一种不好的做法,但这将适用于部门1,例如:

DELETE FROM @Containers 
WHERE Dept  LIKE '%,1'
   OR Dept   LIKE '1,%'
   OR Dept   LIKE '%,1,%'

您必须在条件中强制使用逗号,以将1从捕捉11中排除,以此类推。

将数据存储在逗号分隔的字符串中是一种不好的做法,但这将适用于部门1,例如:

DELETE FROM @Containers 
WHERE Dept  LIKE '%,1'
   OR Dept   LIKE '1,%'
   OR Dept   LIKE '%,1,%'

您必须在条件中强制使用逗号,以从捕捉11中排除1,依此类推。

列表搜索问题中的逗号。在DEPT和字符串中的值周围加逗号:

DELETE FROM @Containers
    WHERE (','+Dept+',' LIKE '%,1,%' OR
           ','+Dept+','  LIKE '%,11,%' OR
           ','+Dept+','  LIKE '%,23,%' OR
           ','+Dept+','  LIKE '%,31,%')

列表中的逗号搜索问题。在DEPT和字符串中的值周围加逗号:

DELETE FROM @Containers
    WHERE (','+Dept+',' LIKE '%,1,%' OR
           ','+Dept+','  LIKE '%,11,%' OR
           ','+Dept+','  LIKE '%,23,%' OR
           ','+Dept+','  LIKE '%,31,%')

使用将字符串拆分为单个值的函数可能更简洁。 这里有一篇关于这个主题的好文章:
使用将字符串拆分为单个值的函数可能更简洁。 这里有一篇关于这个主题的好文章:

啊,是的,其他答案更好,更干净。谢谢你的时间Goat_CO,我选择了上面的答案。啊,是的,其他答案更好,更干净。谢谢你的时间Goat_CO,我选择了上面的答案。刚刚试过,看起来不错,会做一些额外的测试,但非常感谢。你能不能,或者其他人解释一下这个+部门+部分到底在做什么,让我完全理解。再次感谢你,他在前面和后面加了逗号,所以如果4是列表中唯一的值,它变成,4,或者如果4在列表4的前面,它变成,4,,。这样,您就可以在LIKE部分中包含逗号并提取每个结果,而不必执行下面的答案这样的多个LIKE条件。这样更优雅。刚刚试一试,看起来不错,会做一些额外的测试,但非常感谢。你能不能,或者其他人解释一下这个+部门+部分到底在做什么,让我完全理解。再次感谢你,他在前面和后面加了逗号,所以如果4是列表中唯一的值,它变成,4,或者如果4在列表4的前面,它变成,4,,。这样,您就可以在LIKE部分中包含逗号并提取每个结果,而不必执行下面的答案这样的多个LIKE条件。这样更优雅。