gpt4 book ai didi

sql - 检查 varchar 中的字符

转载 作者:行者123 更新时间:2023-12-02 10:03:23 26 4
gpt4 key购买 nike

如何检查 varchar 是否包含另一个 varchar 中的所有字符,其中字符序列无关?

例如:我在表 'Table' 中有 varchar @a = 'ABC' 和列 'Col' ,其中行是'Col' = 'CCAD'。我想选择这一行,因为它包含 @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 条件

最佳答案

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

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)

这给出:

Letter
----------
D
C
A

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

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)
);

如果您的变量可能超过 10 个字符,那么您可能需要采用稍微不同的字符串拆分方法。我仍然会使用数字来执行此操作,但会使用 Itzik Ben-Gan's stacked CTE method :

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;

这将为您提供从 1 到 10,000 的一组数字,您可以根据需要添加更多 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)
);

关于sql - 检查 varchar 中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32758720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com