sqlite выражение с условным действием - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь переместить некоторый код из c # в оператор sql. Целью является скорость и гарантировано. Цель состоит в том, чтобы получить идентификатор выбора, если он найден, и выполнить обновление для него.
Если он не найден, попробуйте выполнить другой запрос выбора и, если он найден, обновить эту запись. Если ЭТО не найдено, вставьте запись и используйте идентификатор этой вставленной записи в обновлении этой записи идентификатора

if  
   select id from table where field1 = "testcase" has a result then update the record andreturn
 else
   select id from table where field2 = "othercase" if there is a result then update the record and return
 else --no record found
 update table field3 = "xx" where id = insert into recorddata values

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Согласитесь с комментарием: вам нужно немного почитать, прежде чем просить выполнить домашнюю работу;) В частности, ознакомьтесь с CASE - укажите в своем собственном вопросе "testcase", "othercase".

Между прочим, SQL является «декларативным» языком, поэтому вам нужно изменить свое мышление с C # при программировании с ним - это поможет двигаться вперед, если у вас есть много дел в SQL

Практически именно то, что вы естьищем здесь .. https://www.sqlitetutorial.net/sqlite-case/

CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
END
0 голосов
/ 10 октября 2019

В SQLite нет конструкции if then else, что эквивалентно CASE при выполнении ELSE END. Тем не менее, вы можете сделать только одно утверждение как таковое одновременно, хотя такие заявления могут быть довольно сложными.

Я думаю, что следующее соответствует тому, что вы хотите, но неясно, что обновить запись означает ни что не значит вставить запись означает.

DROP TABLE IF EXISTS thetable;
CREATE TABLE IF NOT EXISTS thetable (id INTEGER PRIMARY KEY, field1, field2, field3);
INSERT INTO thetable (field1,field2,field3) VALUES('testcase','othercase','aa'),('nottestcase','notothercase','bb'),('nottestcase','othercase','cc'),('testcase','notothercase','dd');
SELECT * FROM thetable;
INSERT INTO theTable SELECT null,field1,field2,null FROM thetable WHERE NOT (field1 = 'testcase' OR field2 = 'othercase');
UPDATE theTable SET field3 = (SELECT id FROM thetable WHERE field3 IS NULL) WHERE (NOT (field1 = 'testcase' OR field2 = 'othercase')) AND field3 IS NOT NULL;
UPDATE theTable SET field3 = 'mynewfield3value' WHERE field1='testcase' OR field2 = 'othercase';
SELECT * FROM thetable;
DROP TABLE IF EXISTS thetable; /* cleanup test environment*/
  • Первые 3 оператора создают среду, то есть заполненную таблицу.
  • 4-й оператор показывает таблицу перед любыми изменениями.
  • 5-й оператор вставляетновая строка, ЕСЛИ есть строка (или строки) для условия - нет записи найдено.
    • Поскольку вопрос о том, что вставлено в значения поля 1 и поля 2 или скопировано из строки - нет записи, строки, идентификатор (если принять этот идентификатор)является типичным идентификатором, который генерируется автоматически) создается автоматически, field3 имеет значение NULL (используется для различения вновь добавленной строки).
    • Если нет - нет записи , тогда ничего не будет вставлено.
  • 6-й оператор обновляет другие - найдены строки, НО НЕ вновь вставленные - даже там не было ряд.
    • Эта строка может быть легко изменена, если поле 3 легко выбрать NULL.
  • 7-е показывает таблицу после изменений.
  • 8-е очищаетдо среды (т.е. отбрасывает таблицу)

Результат 1

enter image description here

  • Подсвеченная строка - это - нет записи строка.

Результат 2

enter image description here

  • Новая строка сдобавлен идентификатор 5 .
  • Строка - нет записи строка была обновлена ​​с идентификатором новой строки.
  • Строки 1,3 и 4 ( - найдена запись строк) обновлены.
  • Неясно, что должно произойти с новымряд.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...