获取 SQL IN 运算符的不存在参数

Get non existence arguments of SQL IN operator

我有以下 SQL 查询:

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

它的结果包含item1和item2,如何得到不存在的参数(item3)?
可能吗?

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

谢谢

对return所有存在进行触发然后执行

SELECT column FROM table WHERE column NOT IN(your proc );

以下查询将 return 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
    )

编辑: 由于在客户端构建这样的 select 语句可能既乏味又危险,您应该注意 sql 注入和格式化问题,我建议您使用 table 值函数,例如以下:

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)

如果将数组转换为 table,就可以做到这一点:

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

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

给出以下 table:

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

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