获取 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。
我有以下 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。