Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何比较两个逗号分隔的字符串,并返回false,直到所有值匹配为止_Sql_Sql Server - Fatal编程技术网

Sql 如何比较两个逗号分隔的字符串,并返回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

我必须将@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.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'