2015-02-08 1 views
0

У меня есть следующий SQL-запрос:Получить письменные аргументы существования SQL IN оператора

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

это результат содержит item1 и item2, Как я могу получить небытие аргумента (item3)?
Возможно ли это?

EDIT: У меня есть множество предметов. каждую минуту некоторые элементы добавляются в массив. Поэтому я должен получить новые элементы, которые являются новыми и не существуют в таблице. После того, что я могу сделать мой процесс и вставить новые элементы в таблицу

Благодаря

+1

Что такое 'аргумент отсутствия существования'? – dotnetom

+0

Вы должны быть понятны на этом. Вы хотите добавить столбец с item3? – szakwani

+0

@dotnetom в этом примере это «item3» – ShayanKM

ответ

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 
    ) 

EDIT: из-за создания такого оператора выбора у заказчика s язь может быть teddious и dangeours, вы должны позаботиться о SQL вопросов инъекций и форматирования, я предлагаю вам использовать таблицу оцененный Funtion как следующее:

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) 
+0

Спасибо! Это сработало ... это как-то похоже на то, что написал @Giorgi_Nakeuri.но я не уверен в производительности этих запросов, это лучший способ? – ShayanKM

+0

Производительность похожа (если не равна) на LEFT JOIN WHERE MyTable.col IS NULL, –

-1

сделать прок вернуть все существование, то сделать это

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

, пожалуйста, проверьте мои изменения в сообщении .. спасибо;) – ShayanKM

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 
+0

Он выполнил эту работу, но я думаю, что использование «union select» Вместо «IN» убьет мое выступление ... Не существует любой другой лучший способ? – ShayanKM

+0

Проверьте новую версию инструкции –

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 

Другой альтернативой передаче элементов хранимой процедуре является параметр table value, а не xml.

+0

Благодарим за внимание к редактированию и +1. Но у меня есть .NET-процесс между запросами select и insert, поэтому их не следует комбинировать. – ShayanKM

+0

Хорошо, я отредактировал свой предыдущий ответ, чтобы предоставить вам то, что я думаю, лучше aproach –