我有以下SQL查询:
SELECT column FROM table WHERE column IN ('item1','item2','item3')
它的结果包含item1和item2,如何获取非存在参数( item3 )?
有可能吗?
修改 我有一系列的项目。每分钟都会有一些新项目添加到数组中。 所以我应该得到新的项目并且不存在于表格中。 之后我可以完成我的流程并将新项目插入表格
谢谢
答案 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 );