IF-оператор в SQLite: обновить или вставить? - PullRequest
6 голосов
/ 22 октября 2011

Я не могу выполнить этот запрос с SQLite

if 0<(select COUNT(*) from Repetition where (Word='behnam' and Topic='mine'))
begin
 update Repetition set Counts=1+ (select Counts from Repetition where (Word='behnam' and Topic='mine'))
end
else
begin
    insert Repetition(Word,Topic,Counts)values('behnam','mine',1)
end

В нем написано "Синтаксическая ошибка рядом с IF" Как я могу решить проблему

Ответы [ 4 ]

6 голосов
/ 11 ноября 2011

SQLite не имеет оператора IF ( см. Список поддерживаемых запросов )

Insetad, проверьте предложение ERIC B о другом нить .Вы эффективно пытаетесь выполнить UPSERT (UPdate, если запись существует, INSERT, если нет).Эрик Б. имеет хороший пример того, как сделать это в синтаксисе SQLite, используя функциональность «INSERT OR REPLACE» в SQLite.По сути, вы бы сделали что-то вроде:

INSERT OR REPLACE INTO Repetition (Word, Topic, Counts)    
VALUES (  'behnam', 'mine',
          coalesce((select Counts + 1 from Repetition 
                   where Word = 'behnam', AND Topic = 'mine)
                   ,1)
       )
3 голосов
/ 06 марта 2012

Другой подход заключается во вставке ... SELECT ... WHERE ... EXISTS [или нет] (SELECT ...);

Я все время так делаю и используюПредложение jklemmack также.И я делаю это также и для других целей, например, для выполнения СОЕДИНЕНИЙ в ОБНОВЛЕНИЯХ (которые SQLite3 не поддерживает).

Например:

CREATE TABLE t(id INTEGER PRIMARY KEY, c1 TEXT NOT NULL UNIQUE, c2 TEXT);
CREATE TABLE r(c1 TEXT NOT NULL UNIQUE, c2 TEXT);
INSERT OR REPLACE INTO t (id, c1, c2)
  SELECT t.id, coalesce(r.c1, t.c1), coalesce(r.c2, t.c2)
  FROM r LEFT OUTER JOIN t ON r.c1 = t.c1
  WHERE r.c2 = @param;

ГДЕ там есть условие, что вы 'иметь в вашем ЕСЛИ.JOIN в SELECT обеспечивает соединение, которое SQLite3 не поддерживает в UPDATE.INSERT OR REPLACE и использование t.id (которое может быть NULL, если строка не существует в t) вместе предоставляют тела THEN и ELSE.

Вы можете применять это снова и снова.Если у вас есть три утверждения (которые не могут быть каким-то образом объединены в одно) в ТОЧНОЙ части IF, вам нужно иметь три утверждения с условием IF в их ГДЕ.

0 голосов
/ 14 сентября 2017

Один способ, который я нашел, основан на SQL WHERE предложение true / false:

SELECT * FROM SOME_TABLE
WHERE
  ( 
    SELECT SINGLE_COLUMN_NAME FROM SOME_OTHER_TABLE
    WHERE 
    SOME_COLUMN = 'some value' and 
    SOME_OTHER_COLUMN = 'some other value'
  )

На самом деле это означает выполнение некоторого запроса, если какой-либо другой запрос возвращает «любой» результат.

0 голосов
/ 12 июня 2013

Это называется UPSERT (т. Е. UPdate или inSERT).Он имеет свои формы почти в каждом типе базы данных.Посмотрите на этот вопрос для версии SQLite: SQLite - UPSERT * не * INSERT или REPLACE

...