0

列内の都市のリストを含むSQLテーブルがあります。別の都市のリストがあり、テーブルに存在する都市と存在しない都市が、それぞれそのリストに存在する都市と存在しない都市を見つけたいと思います。

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

リストを次のように言います:「ABC」、「DEF」、「MNO」、「PQR」、「STU」

したがって、出力として2つのリストが必要です。

表に存在:

'ABC' 
'DEF' 
'MNO'

表に存在しません:

'PQR'
'STU'
4

3 に答える 3

1

私はあなたのリストが文字列/varcharであると仮定します、そしてあなたは最初にすべての部分を取得するために分割関数を必要とします:

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
)

デモ

結果:

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  
于 2013-02-18T16:22:03.650 に答える
0

あなたの「リスト」がテーブルにあるようです。これは単純なはずです:

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

と:

select value from list exclude select city from cities
于 2013-02-18T16:39:24.250 に答える
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
于 2016-02-26T13:13:58.223 に答える