IF ELSE обходной путь в Sqlite - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь сделать простой запрос на вставку в SQL. Этот запрос работает в SQL Server

IF (EXISTS (SELECT * FROM TableName WHERE SomeId = @SomeId AND SomeOtherId = @SomeOtherId))
    BEGIN
        UPDATE TableName 
        SET "SomeColumn" = @SomeValue 
        WHERE SomeId = @SomeId AND SomeOtherId = @SomeOtherId;
    END
    ELSE
    BEGIN
        INSERT INTO TableName VALUES (@SomeId, @SomeOtherId, @SomeValue);
    END

Однако наши модульные тесты выполняются на Sqlite, и в целом мы хотим написать ванильный SQL, так что этот IF ELSE не будет работать. Я пытался осуществить это с CASE WHEN, но я не могу понять это правильно. Может кто-нибудь опубликовать рабочий запрос Sqlite?

Заранее спасибо, Марко

1 Ответ

3 голосов
/ 02 октября 2019

Если есть (или вы можете создать) уникальное ограничение для комбинации столбцов SomeId и SomeOtherId, то вы можете использовать UPSERT следующим образом:

INSERT INTO TableName(SomeId, SomeOtherId, SomeColumn)
VALUES(@SomeId, @SomeOtherId, @SomeValue)
ON CONFLICT(SomeId, SomeOtherId) DO 
UPDATE SET SomeColumn = @SomeValue;

Если нет, то используйте 2 оператора:

UPDATE TableName 
SET SomeColumn = @SomeValue 
WHERE SomeId = @SomeId AND SomeOtherId = @SomeOtherId;

INSERT INTO TableName (SomeId, SomeOtherId, SomeColumn) 
SELECT @SomeId, @SomeOtherId, @SomeValue
WHERE NOT EXISTS (
  SELECT 1 FROM TableName
  WHERE SomeId = @SomeId AND SomeOtherId = @SomeOtherId
);

Оператор UPDATE будет успешным, только если в указанных вами условиях есть строка, в противном случае он ничего не будет делать. Оператор INSERT будет успешным, только если в указанных вами условиях нет строки, иначе он ничего не будет делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...