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

时间:2015-02-08 10:18:14

标签: sql sql-server in-operator

我有以下SQL查询:

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

它的结果包含item1和item2,如何获取非存在参数( item3 )?
有可能吗?

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

谢谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    )

编辑: 因为在客户端构建这样的select语句可能是繁琐的和dangeours,你应该注意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)

答案 2 :(得分: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。

答案 3 :(得分:-1)

使proc返回所有存在然后执行

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