1

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

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

由于查询过于复杂,我现在将停止,如果您需要任何进一步的信息,请告诉我。

4

3 回答 3

4

The commas-in-the-list searching problem. Put commas around DEPT and around the values in the string:

DELETE FROM @Containers
    WHERE (','+Dept+',' LIKE '%,1,%' OR
           ','+Dept+','  LIKE '%,11,%' OR
           ','+Dept+','  LIKE '%,23,%' OR
           ','+Dept+','  LIKE '%,31,%')
于 2013-06-05T13:51:25.470 回答
1

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

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

您必须在标准中强制使用逗号才能将 1 从捕获 11 中排除,依此类推。

于 2013-06-05T13:50:29.267 回答
0

使用将字符串拆分为单个值的函数可能更简洁。这里有一篇关于这个主题的好文章:
http ://www.sqlperformance.com/2012/07/t-sql-queries/split-strings

于 2013-06-05T15:07:45.307 回答