0

我有以下 SQL 查询:

SELECT column FROM table WHERE column IN ('item1','item2','item3')

它的结果包含 item1 和 item2,我怎样才能得到不存在的论点(item3)?
可能吗?

编辑: 我有一系列项目。每分钟都会有一些新项目添加到数组中。所以我应该得到表中不存在的新项目。之后我可以完成我的过程并将新项目插入到表中

谢谢

4

4 回答 4

3

如果您将数组转换为如下表格,则可以这样做:

Select * From 
( select 'item1' As Column
  union
  select 'item2' As Column
  union
  select 'item3' As Column
) l
left join Table t on l.Column = t.Column
Where t.Column is NULL

没有联合的版本:

Select * From 
    ( VALUES
      ('Item1'),
      ('Item2'),
      ('Item3')  
    ) As l(Column)
    left join Table t on l.Column = t.Column
    Where t.Column is NULL
于 2015-02-08T10:29:29.797 回答
2

阅读您的编辑后,我可以建议您采用以下方法。因为您想将不存在的项目插入表中,所以我认为您可以在一个合并语句中完成

给定下表:

CREATE TABLE Items
(
    item nvarchar(128) PRIMARY KEY
)

您可以将数组中的新项目以 xml 形式传递给以下存储过程:

CREATE PROCEDURE InsertIfNotExists @Items xml
AS
    WITH B
    AS
    (
        SELECT c.value('.', 'nvarchar(128)') As item
        FROM @items.nodes('items/item') T(c)
    )
    MERGE INTO Items I
    USING B ON B.Item = I.Item
    WHEN NOT MATCHED BY TARGET THEN
    INSERT (Item) VALUES (Item);

GO

这里有一个示例执行:

DECLARE @items XML = N'
<items>
    <item>Item1</item>
    <item>Item2</item>
    <item>Item3</item>
    <item>Item4</item>
</items>'

EXEC InsertIfNotExists @items

将项目传递给存储过程的另一种方法是使用表值参数而不是 xml。

于 2015-02-08T11:04:19.493 回答
2

以下查询将返回 MyTable 中不存在的项目:

WITH B
AS
(
    SELECT 'Item1' AS col
    UNION ALL
    SELECT 'Item2' 
    UNION ALL
    SELECT 'Item3' 

)
SELECT B.col
FROM B
WHERE
    NOT EXISTS (
        SELECT *
        FROM MyTable T
        WHERE
            T.col = B.col
    )

编辑:由于在客户端构建这样一个选择语句可能很乏味和危险,你应该注意 sql 注入和格式化问题,我建议你使用如下表值函数:

CREATE TABLE Items
(
    item nvarchar(128) PRIMARY KEY
)

GO

CREATE FUNCTION GetNonExistingItems( @Items xml )
RETURNS TABLE
AS RETURN
WITH B
AS
(
    SELECT c.value('.', 'nvarchar(128)') As item
    FROM @items.nodes('items/item') T(c)
)
SELECT B.item
FROM B
WHERE
    NOT EXISTS (
        SELECT *
        FROM Items I
        WHERE B.item = i.item

    )

GO

DECLARE @items XML = N'
<items>
    <item>Item1</item>
    <item>Item2</item>
    <item>Item5</item>
</items>'

SELECT *
FROM GetNonExistingItems (@Items)
于 2015-02-08T10:27:55.187 回答
-1

制作一个过程以返回所有存在然后执行它

SELECT column FROM table WHERE column NOT IN(your proc );
于 2015-02-08T10:26:11.660 回答