sql – 检查varchar中的字符

前端之家收集整理的这篇文章主要介绍了sql – 检查varchar中的字符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我如何检查varchar是否包含来自另一个varchar的所有字符,其中字符序列是无关紧要的?

例如:我在表’Table’中有varchar @a =’ABC’和列’Col’在哪里是’Col’=’CBAD’的行.我想选择这个行,因为它包含@a变量中的所有字符.请你帮忙

我尝试过这样的事情:

  1. DECLARE @a varchar(5) = 'ABCD'
  2. DECLARE @b varchar(5) = 'DCA'
  3.  
  4. DECLARE @i int = 0
  5.  
  6. DECLARE @pat varchar(30) = ''
  7. while @i <> len(@b) BEGIN
  8. SET @i = @i + 1
  9. SET @pat = @pat + '[' + @a + ']'
  10. END
  11.  
  12. SELECT @pat
  13.  
  14. IF @b LIKE @pat SELECT 1
  15. ELSE SELECT 0

但是我不能把它放在WHERE条件下

解决方法

您首先需要将要检查的变量拆分成行,并删除重复项.只有几个字符,你可以简单地使用一个表值构造函数
  1. DECLARE @b varchar(5) = 'DCA';
  2. SELECT DISTINCT Letter = SUBSTRING(@b,n.Number,1)
  3. FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (Number)
  4. WHERE n.Number <= LEN(@b)

这使:

  1. Letter
  2. ----------
  3. D
  4. C
  5. A

现在您可以将其与列进行比较,并将其仅限于列包含所有字母的列(在HAVING子句中完成)

  1. DECLARE @b varchar(5) = 'DCA';
  2.  
  3. WITH Letters AS
  4. ( SELECT DISTINCT Letter = SUBSTRING(@b,1)
  5. FROM (VALUES(1),(10)) AS n (Number)
  6. WHERE n.Number <= LEN(@b)
  7. )
  8. SELECT *
  9. FROM (VALUES ('AA'),('ABCD'),('ABCDEFG'),('CAB'),('NA')) AS t (Col)
  10. WHERE EXISTS
  11. ( SELECT 1
  12. FROM Letters AS l
  13. WHERE t.Col LIKE '%' + l.Letter + '%'
  14. HAVING COUNT(DISTINCT l.Letter) = (SELECT COUNT(*) FROM Letters)
  15. );

如果您的变量可能长于10个字符,则可能需要采用略有不同的字符串拆分方法.我仍然会使用数字来做到这一点,而是使用Itzik Ben-Gan’s stacked CTE method

  1. WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1)) AS n (N)),N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2)
  2. SELECT ROW_NUMBER() OVER(ORDER BY N)
  3. FROM N3;

这将给您一组从1到10,000的数字,您可以根据需要简单地添加更多的CTE和交叉连接来扩展该过程.所以用一个更长的字符串你可能有:

  1. DECLARE @b varchar(5) = 'DCAFGHIJKLMNEOPNFEDACCRADFAE';
  2.  
  3. WITH N1 AS (SELECT N FROM (VALUES(1),N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),Numbers (Number) AS (SELECT TOP (LEN(@b)) ROW_NUMBER() OVER(ORDER BY N) FROM N3),Letters AS (SELECT DISTINCT Letter = SUBSTRING(@b,1) FROM Numbers AS n)
  4. SELECT *
  5. FROM (VALUES ('ABCDDCAFGHIJKLMNEOPNFEDACCRADFAEEFG'),('NA')) AS t (Col)
  6. WHERE EXISTS
  7. ( SELECT 1
  8. FROM Letters AS l
  9. WHERE t.Col LIKE '%' + l.Letter + '%'
  10. HAVING COUNT(DISTINCT l.Letter) = (SELECT COUNT(*) FROM Letters)
  11. );

猜你在找的MsSQL相关文章