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

时间:2013-06-05 13:38:42

标签: sql sql-server tsql sql-server-2005

我在尝试基于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(或这些的组合)。

这是否可以使用字符串列?我们可以以某种方式使用分隔符来改进查询吗?

我现在停止作为过度复杂查询的风险,如果您需要任何进一步的信息,请告诉我。

3 个答案:

答案 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