SQL:根据字符串值列表获取值并且不存在于表中

时间:2013-02-18 15:50:53

标签: sql sql-server select

我有一个SQL表,其中包含列中的城市列表。 我有一个单独的城市列表,我想找出表中没有的城市,但是不存在并分别出现在该列表中。

实施例

CityId    CityName
1            ABC
2            DEF
3            GHI
4            JKL
5            MNO

说清单是: 'ABC','DEF','MNO','PQR','STU'

因此输出我需要两个列表:

出现在表格中:

'ABC' 
'DEF' 
'MNO'

表中不存在:

'PQR'
'STU'

3 个答案:

答案 0 :(得分:1)

我认为你的列表是一个字符串/ varchar,然后你首先需要一个split-function来获取所有部分:

1。)然后可以使用INNER JOIN查找表中的所有内容:

SELECT CityId,CityName
FROM Cities c
INNER JOIN dbo.Split('ABC,DEF,MNO,PQR,STU',',')x
ON c.CityName = x.Item;

2。)和NOT EXISTS查找列表中但不在表格中的所有内容:

SELECT x.Item As CityName
FROM  dbo.Split('ABC,DEF,MNO,PQR,STU',',')x
WHERE NOT EXISTS 
(
  SELECT 1 
  FROM Cities c
  WHERE c.CityName = x.Item
)

DEMO

结果:

1)

CITYID  CITYNAME
  1       ABC
  2       DEF
  5       MNO

2)

CITYNAME
PQR
STU

这是我的分裂功能:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

答案 1 :(得分:0)

看起来你的“列表”在表格中。这应该是简单的:

select distinct value from list where value in (select distinct city from cities)

select value from list exclude select city from cities

答案 2 :(得分:0)

出现在表格值中:

SELECT v.valueName AS PresentInTable from (VALUES ('ABC'),('DEF'),('MNO'),('PQR'),('STU')) 
v(valueName) 
LEFT JOIN Cities c on c.CityName = v.valueName
WHERE c.CityId IS NOT NULL

不在表中:

SELECT v.valueName AS NotPresentInTable from (VALUES ('ABC'),('DEF'),('MNO'),('PQR'),('STU')) 
v(valueName) 
LEFT JOIN Cities c on c.CityName = v.valueName
WHERE c.CityId IS NULL