Как синтаксис делать вставки с условиями? Например: проверить, нет ли значения, которое я хочу вставить, в таблице? (учитывая, что столбец может быть нулевым)SQL Server: как сделать вставку с условием
ответ
Ваше описание очень короткое, но похоже, что вы хотите сделать заявление MERGE
.
http://technet.microsoft.com/en-us/library/bb510625.aspx
который может быть использован для вставки/обновления/удаления на основе данных, если существует или не все в одном заявлении.
Вы имеете в виду что-то вроде этого?
insert into t(col)
select 'value'
where not exists (select 1 from t where col = 'value');
Однако я бы рекомендовал использовать уникальный индекс, отфильтрованный индекс или ограничение внешнего ключа для обеспечения целостности данных.
Предполагаемые значения, которые вы хотите вставить, являются переменными.
Вы можете использовать IF NOT EXISTS
:
IF NOT EXISTS (SELECT * FROM Table1 WHERE Col1 = @Val1 AND Col2 = @Val2)
INSERT INTO Table1 (Col1, COl2) VALUES (@Val1, @Val2)
или вы можете использовать SELECT..WHERE
с EXISTS
INSERT INTO Table1 (Col1, COl2)
SELECT @Val1, @Val2
WHERE NOT EXISTS (SELECT * FROM Table1 WHERE Col1 = @Val1 AND Col2 = @Val2)
или, возможно, еще несколько методов (NOT IN, LEFT JOIN, MERGE ...)
Попробуйте следующее:
insert into target_table (col1, col2, ...)
select col1, col2, ...
from source_table
where col_x not in (
select col_y from target_tabke where col_y is not null)
or (col_x is null and not exists (
select * from target_table where col_y is null))
Для SQL Server 2008 можно использовать MERGE statement таким образом:
DECLARE @Orders TABLE(
OrderID INT PRIMARY KEY,
Customer NVARCHAR(50) NOT NULL
);
INSERT @Orders(OrderID,Customer)
VALUES(1,'A'),(2,'B'),(3,'A');
MERGE @Orders trg -- Target table
USING (VALUES(1,'A new name'),(4,'D')) src(OrderID,NewCustomer) -- Source table
ON trg.OrderID=src.OrderID
WHEN MATCHED THEN -- If one rows exists in both table then UPDATE target table with the new Customer name
UPDATE SET Customer=src.NewCustomer
WHEN NOT MATCHED BY TARGET THEN -- If one row doesn't exists in target table then INSERT that row
INSERT (OrderID,Customer)
VALUES (src.OrderID,src.NewCustomer);
SELECT *
FROM @Orders o;
Результаты:
OrderID Customer
----------- ----------
1 A new name -- <-- row updated
2 B
3 A
4 D -- <-- row inserted
Вы можете использовать левый или правый присоединиться, например,
WITH SourceTable AS
(
SELECT
*
FROM (VALUES
('A', 1)
,('A', 2)
,('B', 1)
,('C', 10)) nTable(nCol1, nCol2)
)
SELECT
*
INTO #SourceTable
FROM SourceTable;
WITH NewRows AS
(
SELECT
*
FROM (VALUES
('A', 2)
,('A', 3)
,('B', 1)
,('C', 11)) nTable(nCol1, nCol2)
)
INSERT #SourceTable
(nCol1
,nCol2)
SELECT
n.nCol1
,n.nCol2
FROM #SourceTable s
RIGHT JOIN NewRows n
ON s.nCol1=n.nCol1
AND s.nCol2=n.nCol2
WHERE s.nCol1 IS NULL;