【问题标题】:Find Values not in Table from SPLIT_STRING从 SPLIT_STRING 中查找不在表中的值
【发布时间】:2019-12-12 13:22:56
【问题描述】:

我有一个过程可以根据它们是否在逗号分隔的字符串中来查找表中的所有记录。

DECLARE @PMIDList NVARCHAR(max) = '31282781,31226541,30518502,30262330,30154192,29781323,29222269,28516439,28314698,27130328,26031546,25963431'

SELECT PMID 
FROM ADMIN_API_Pubs_Members 
INNER JOIN STRING_SPLIT(@PMIDList,',') ON value = dbo.ADMIN_API_Pubs_Members.PMID

但是我想稍微改变一下,找到不在表中的逗号分隔字符串中的值。

我加了

SELECT PMID 
FROM ADMIN_API_Pubs_Members 
INNER JOIN STRING_SPLIT(@PMIDList,',') ON value = dbo.ADMIN_API_Pubs_Members.PMID
WHERE ADMIN_API_Pubs_Members.PMID IS NULL

但是我怎样才能让逗号字符串值显示为值呢?我是否需要将所有值放入 tmp 表中,然后进行联合查找 NULL 记录?我正在使用 SQL Server 2016。

【问题讨论】:

  • 谢谢大家——当他们都做我需要的事情时,我怎么能选择一个最佳答案,但只是有点不同。你们每个人都真的帮助了我。谢谢。我会和三个人一起玩一个晚上。
  • 您可以通过投票来表彰他们。你可以选择表现最好的那个。或西部最快的枪(我认为这是 Ed Bangga)。或者你最喜欢的那个......这完全取决于你:-)

标签: sql tsql stored-procedures split sql-server-2016


【解决方案1】:

这是您的查询

SELECT * FROM (
 SELECT t1.value, PMID 
 FROM  STRING_SPLIT(@PMIDList,',') t1
 LEFT JOIN ADMIN_API_Pubs_Members ON value = dbo.ADMIN_API_Pubs_Members.PMID
) t2 WHERE t2.PMID IS NULL

【讨论】:

    【解决方案2】:

    如果您想获取存在于逗号分隔值中但不在表格中的值,您可以通过这种方式获取数据。

    select '31282781' as ID into #temp union all 
    select '31226541' as ID union all 
    select '30518502' as ID union all 
    select '30262330' as ID  
    
    DECLARE @PMIDList NVARCHAR(max) = '31282781,31226541,30518502,30262330,30154192,29781323,29222269,28516439,28314698,27130328,26031546,25963431'
    
    SELECT  value as CSVdata   
    FROM   STRING_SPLIT(@PMIDList,',') t2 
    left join #temp t  on t2.value = t.ID 
    where t.ID is null 
    

    输出:

     CSVdata
    30154192
    29781323
    29222269
    28516439
    28314698
    27130328
    26031546
    25963431
    

    【讨论】:

      【解决方案3】:

      一种选择是使用 NOT EXISTS ()

      SELECT *
      FROM   STRING_SPLIT(@PMIDList,',') v
      WHERE  NOT EXISTS
             (
                 SELECT *
                 FROM   ADMIN_API_Pubs_Members x
                 WHERE  x.PMID  = v.VALUE
             )
      

      【讨论】:

        【解决方案4】:

        您正在尝试做的事情称为反联接。对于反连接,您可以使用 NOT INNOT EXISTSEXCEPT。请注意下面的示例数据(我从@yourtable 中排除了字符串中的最后三个项目)。

        -- Sample data
        DECLARE @yourtable TABLE (PMID BIGINT);
        INSERT @yourtable VALUES (31282781),(31226541),(30518502),(30262330),(30154192),
                                 (29781323),(29222269),(28516439),(28314698);    
        
        -- Sample List
        DECLARE @PMIDList NVARCHAR(max) = 
          '31282781,31226541,30518502,30262330,30154192,29781323,29222269,28516439,28314698,27130328,26031546,25963431';
        
        -- Solution #1 using EXCEPT
        SELECT s.[value] FROM string_split(@PMIDList,',') AS s
        EXCEPT 
        SELECT t.PMID    FROM @yourtable AS t;
        
        -- Solution #2 using NOT IN
        SELECT s.[value]
        FROM   string_split(@PMIDList,',') AS s
        WHERE  s.[value] NOT IN (SELECT t.PMID FROM @yourtable AS t);
        

        每个解决方案都返回仅存在于字符串中的行。 EXCEPT 更简洁,会删除重复项,NOT IN 不会删除重复项。删除重复项需要排序;如果您不需要担心重复,那么 NOT IN(或 NOT EXISTS)会更有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多