我有以下 SQL 查询:
SELECT column FROM table WHERE column IN ('item1','item2','item3')
它的结果包含 item1 和 item2,我怎样才能得到不存在的论点(item3)?
可能吗?
编辑: 我有一系列项目。每分钟都会有一些新项目添加到数组中。所以我应该得到表中不存在的新项目。之后我可以完成我的过程并将新项目插入到表中
谢谢
我有以下 SQL 查询:
SELECT column FROM table WHERE column IN ('item1','item2','item3')
它的结果包含 item1 和 item2,我怎样才能得到不存在的论点(item3)?
可能吗?
编辑: 我有一系列项目。每分钟都会有一些新项目添加到数组中。所以我应该得到表中不存在的新项目。之后我可以完成我的过程并将新项目插入到表中
谢谢
如果您将数组转换为如下表格,则可以这样做:
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
阅读您的编辑后,我可以建议您采用以下方法。因为您想将不存在的项目插入表中,所以我认为您可以在一个合并语句中完成
给定下表:
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。
以下查询将返回 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)
制作一个过程以返回所有存在然后执行它
SELECT column FROM table WHERE column NOT IN(your proc );