Sql 检查varchar中的字符

Sql 检查varchar中的字符,sql,sql-server,varchar,contain,Sql,Sql Server,Varchar,Contain,如何检查varchar是否包含来自另一个varchar的所有字符,其中字符序列是不相关的 例如:我有varchar@a='ABC'和表'table'中的'Col'列,其中是'Col'='CBAD'的行。我想选择此行,因为它包含@a变量中的所有字符。谢谢你的帮助 我试过这样的方法: DECLARE @a varchar(5) = 'ABCD' DECLARE @b varchar(5) = 'DCA' DECLARE @i int = 0 DECLARE @pat varchar(30) =

如何检查varchar是否包含来自另一个varchar的所有字符,其中字符序列是不相关的

例如:我有varchar@a='ABC'和表'table'中的'Col'列,其中是'Col'='CBAD'的行。我想选择此行,因为它包含@a变量中的所有字符。谢谢你的帮助

我试过这样的方法:

DECLARE @a varchar(5) = 'ABCD'
DECLARE @b varchar(5) = 'DCA'

DECLARE @i int = 0

DECLARE @pat varchar(30) = ''
while @i <> len(@b) BEGIN
    SET @i = @i + 1
    SET @pat = @pat + '[' + @a + ']'
END

SELECT @pat

IF @b LIKE @pat SELECT 1
ELSE SELECT 0
但我无法将其置于WHERE条件下

您可以这样尝试:

SELECT * FROM yourTable where colname like '%[A]%' 
                        AND colname like '%[B]%'
                        AND colname like '%[C]%'
或者你可以尝试使用


首先需要将要检查的变量拆分为行,并删除重复项。对于仅几个字符,您可以简单地使用表值构造函数:

DECLARE @b varchar(5) = 'DCA';
SELECT  DISTINCT Letter = SUBSTRING(@b, n.Number, 1)
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (Number)
WHERE n.Number <= LEN(@b)
现在,您可以将其与列进行比较,并将其仅限于列中包含HAVING子句中完成的所有字母的列

这将为您提供一组从1到10000的数字,您可以根据需要添加更多的CTE和交叉连接来扩展该过程。因此,如果使用更长的字符串,您可能会:

DECLARE @b varchar(5) = 'DCAFGHIJKLMNEOPNFEDACCRADFAE';

WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(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),
Numbers (Number) AS (SELECT TOP (LEN(@b)) ROW_NUMBER() OVER(ORDER BY N) FROM N3),
Letters AS (SELECT DISTINCT Letter = SUBSTRING(@b, n.Number, 1) FROM Numbers AS n)
SELECT  *
FROM    (VALUES ('ABCDDCAFGHIJKLMNEOPNFEDACCRADFAEEFG'), ('CAB'), ('NA')) AS t (Col)
WHERE   EXISTS
        (   SELECT  1
            FROM    Letters AS l
            WHERE   t.Col LIKE '%' + l.Letter + '%'
            HAVING  COUNT(DISTINCT l.Letter) = (SELECT COUNT(*) FROM Letters)
        );
还有一个版本:

DECLARE @a varchar(5) = 'ABCD'
DECLARE @b varchar(5) = 'DCA'

;WITH cte AS(
SELECT ROW_NUMBER() OVER( ORDER BY (SELECT NULL)) rn
FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(n)
CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) b(n)
),
astring AS(SELECT DISTINCT SUBSTRING(@a, rn, 1) AS l FROM cte WHERE rn <= LEN(@a)),
bstring AS(SELECT DISTINCT SUBSTRING(@b, rn, 1) AS l FROM cte WHERE rn <= LEN(@b))
SELECT CASE WHEN EXISTS(SELECT * FROM bstring WHERE l NOT IN(SELECT * FROM astring)) 
            THEN 0 ELSE 1 
       END AS result

单引号用于字符串/varchar文本。不要将它们用于列或表名。第二个解决方案只检查colname中是否存在1个字符。它将给出与第一个解决方案相同的结果,使用或代替AND
DECLARE @b varchar(5) = 'DCA';

WITH Letters AS
(   SELECT  DISTINCT Letter = SUBSTRING(@b, n.Number, 1)
    FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (Number)
    WHERE n.Number <= LEN(@b)
)
SELECT  *
FROM    (VALUES ('AA'), ('ABCD'), ('ABCDEFG'), ('CAB'), ('NA')) AS t (Col)
WHERE   EXISTS
        (   SELECT  1
            FROM    Letters AS l
            WHERE   t.Col LIKE '%' + l.Letter + '%'
            HAVING  COUNT(DISTINCT l.Letter) = (SELECT COUNT(*) FROM Letters)
        );
WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(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)
SELECT  ROW_NUMBER() OVER(ORDER BY N)
FROM    N3;
DECLARE @b varchar(5) = 'DCAFGHIJKLMNEOPNFEDACCRADFAE';

WITH N1 AS (SELECT N FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(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),
Numbers (Number) AS (SELECT TOP (LEN(@b)) ROW_NUMBER() OVER(ORDER BY N) FROM N3),
Letters AS (SELECT DISTINCT Letter = SUBSTRING(@b, n.Number, 1) FROM Numbers AS n)
SELECT  *
FROM    (VALUES ('ABCDDCAFGHIJKLMNEOPNFEDACCRADFAEEFG'), ('CAB'), ('NA')) AS t (Col)
WHERE   EXISTS
        (   SELECT  1
            FROM    Letters AS l
            WHERE   t.Col LIKE '%' + l.Letter + '%'
            HAVING  COUNT(DISTINCT l.Letter) = (SELECT COUNT(*) FROM Letters)
        );
DECLARE @a varchar(5) = 'ABCD'
DECLARE @b varchar(5) = 'DCA'

;WITH cte AS(
SELECT ROW_NUMBER() OVER( ORDER BY (SELECT NULL)) rn
FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(n)
CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) b(n)
),
astring AS(SELECT DISTINCT SUBSTRING(@a, rn, 1) AS l FROM cte WHERE rn <= LEN(@a)),
bstring AS(SELECT DISTINCT SUBSTRING(@b, rn, 1) AS l FROM cte WHERE rn <= LEN(@b))
SELECT CASE WHEN EXISTS(SELECT * FROM bstring WHERE l NOT IN(SELECT * FROM astring)) 
            THEN 0 ELSE 1 
       END AS result
SELECT * FROM yourTable WHERE PATINDEX('%A%',colname) >= 1 and PATINDEX('%B%',colname) >= 1 AND PATINDEX('%C%',colname) >= 1