Sql 如何比较两个逗号分隔的字符串,并返回false,直到所有值匹配为止
我必须将@v2和@v3的值与@v1的值进行比较。 我需要一个函数,如果所有值都匹配,它将返回TRUE。因此,在上面的示例中,@v3将返回TRUE,@v2将返回false 我正在试着写一段代码,但它不起作用。 我在这里提到代码Sql 如何比较两个逗号分隔的字符串,并返回false,直到所有值匹配为止,sql,sql-server,Sql,Sql Server,我必须将@v2和@v3的值与@v1的值进行比较。 我需要一个函数,如果所有值都匹配,它将返回TRUE。因此,在上面的示例中,@v3将返回TRUE,@v2将返回false 我正在试着写一段代码,但它不起作用。 我在这里提到代码 suppose @v1 = p1;p2;p3;p4 @v2 = p1;p2;p3 @v3= p1;p2;p3;p4 对于所有值匹配,可以使用equal运算符: SELECT CASE WHEN EXISTS ( SELECT 1 FROM dbo.Spli
suppose @v1 = p1;p2;p3;p4
@v2 = p1;p2;p3
@v3= p1;p2;p3;p4
对于所有值匹配,可以使用equal运算符:
SELECT CASE WHEN EXISTS
(
SELECT 1
FROM dbo.Split(@v1) AS a
INNER JOIN dbo.Split(@v2) AS b
ON a.Item = b.Item
)
THEN 1 ELSE 0 END;
how can it be possible in sql server? plz help.
假设您的函数是表值函数。测试后,我修改了答案:
DECLARE @v1 VARCHAR(20) = 'p1;p2;p3;p4'
DECLARE @v2 VARCHAR(20) = 'p1;p2;p3'
DECLARE @v3 VARCHAR(20) = 'p1;p2;p3;p4'
IF @v1 = @v2
PRINT 'V1=V2'
ELSE IF @v1 = @v3
PRINT 'V1=V3'
IF EXISTS(SELECT 1
FROM dbo.Split(@v1) AS a
INNER JOIN dbo.Split(@v2) AS b
ON a.Item = b.Item)
SELECT 1
ELSE
SELECT 0
试试这个
CREATE FUNCTION CommaListsAreEqual
(
@CommaList1 varchar(1000),
@CommaList2 varchar(1000)
)
RETURNS BIT
AS
BEGIN
DECLARE @Retval INT;
WITH
Table1 (Item)
AS
(
SELECT Item FROM dbo.Split(@CommaList1, ',')
),
Table2 (Item)
AS
(
SELECT Item FROM dbo.Split(@CommaList2, ',')
)
SELECT
@Retval = COUNT(*)
FROM
Table1
FULL OUTER JOIN Table2 ON Table1.Item = Table2.Item
WHERE
Table1.Item IS NULL
OR
Table2.Item IS NULL
RETURN CASE WHEN @Retval = 0 THEN 1 ELSE 0 END
END
GO
-- Tests:
SELECT dbo.CommaListsAreEqual('1,2,3', '1,2,3') -- Should return 1
SELECT dbo.CommaListsAreEqual('1,2,3', '1,2,5') -- Should return 0
分隔字符串不是在SQL Server中处理多个值的自然方式-SQL Server有两种数据类型用于保存多个值-XML和表-您是否可以改为使用其中一种?
CREATE FUNCTION Checks(@v1 VARCHAR(100),@v2 VARCHAR(100),@v3 VARCHAR(100))
RETURNS INT
AS
BEGIN
RETURN
(SELECT Count(1)
FROM (SELECT Split.a.value('.', 'VARCHAR(100)') col
FROM (SELECT Cast ('<M>' + Replace(@v1, ';', '</M><M>') + '</M>' AS XML) AS Data) AS f
CROSS APPLY Data.nodes ('/M') AS Split(a)) fst
WHERE NOT EXISTS (SELECT *
FROM (SELECT Split.a.value('.', 'VARCHAR(100)') col
FROM (SELECT Cast ('<M>' + Replace(@v2, ';', '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
UNION
SELECT Split.a.value('.', 'VARCHAR(100)') col
FROM (SELECT Cast ('<M>' + Replace(@v3, ';', '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) kl
WHERE fst.col = kl.col))
END
DECLARE @v1 VARCHAR(100) = 'p1;p2;p3;p4',
@v2 VARCHAR(100) = 'p1;p2;p3;p4',
@v3 VARCHAR(100) = 'p1;p2;p3'
SELECT CASE WHEN dbo.Checks(@v1, @v2, @v3) = 0 THEN 'MATCHED' ELSE 'NOT MATCHED' END [Check]
-- OUTPUT : 'MATCHED'
DECLARE @v1 VARCHAR(100) = 'p1;p2;p3;p4',
@v2 VARCHAR(100) = 'p1;p2;p3',
@v3 VARCHAR(100) = 'p1;p2;p3'
SELECT CASE WHEN dbo.Checks(@v1, @v2, @v3) = 0 THEN 'MATCHED' ELSE 'NOT MATCHED' END [Check]
-- OUTPUT : 'NOT MATCHED'