MySQL тест IF, если переменная равна NULL (или пусто) - PullRequest
0 голосов
/ 26 июня 2019

мы выбираем строку в mysql / mariadb и сохраняем выбранные столбцы в переменных.После этого, используя IF, мы хотели бы проверить одну из переменных и посмотреть, была ли она установлена ​​или равна нулю, если это так, то мы присваиваем ей значение и продолжаем.

Использование IS NULL, по-видимому, не работает с не выражением.

select id,history,active,jsonorder
INTO @id,@history,@active,@jsonorder
from myTable where uid = myUid
delimiter |
IF @jsonorder IS NULL THEN
  @myNewVal="zzz";
ELSE
  @myNewVal="yyy";
END IF|
insert into otherTable (colA) VALUES (@myNewVar);

Как правильно проверить, предоставил ли select значение в переменную, такую ​​как@jsonorder

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Мы могли бы использовать выражение в списке SELECT:

SELECT t.id
     , t.history
     , t.active
     , IFNULL(t.order,1) AS `order`
  INTO @id
     , @history
     , @active
     , @order
  FROM `myTable` t
 WHERE t.uid = ...

Обратите внимание, что DELIMITER не является оператором SQL; эта команда распознается клиентом командной строки mysql (и некоторыми другими клиентами).

задокументировано здесь в Справочном руководстве MySQL: https://dev.mysql.com/doc/refman/8.0/en/mysql-commands.html


Непонятно, в каком контексте запускается этот скрипт; эта часть хранимой программы MySQL или называется кодом приложения. Чего мы на самом деле пытаемся достичь?


Есть несколько других выражений, которые мы могли бы использовать в списке SELECT, например,

CASE WHEN t.order IS NULL THEN 1 ELSE t.order END` 

или

IF(t.order IS NULL,1,t.order)

и др.


Followup

Если мы не хотим изменять исходный оператор SQL; если мы выполним это:

SELECT t.id
     , t.history
     , t.active
     , t.jsonorder
  INTO @id
     , @history
     , @active
     , @jsonorder
  FROM `myTable` t
 WHERE t.uid = ...

И затем мы хотим выполнить присваивание другой пользовательской переменной, основываясь на условном тесте, мы можем добиться этого с помощью другого оператора SELECT или SET.

Например:

SELECT @myNewVal := IF(@jsonorder IS NULL,'zzz','yyy') ;
                      ELSE 'yyy'

-или-

SELECT CASE
         WHEN @jsonorder IS NULL 
         THEN 'zzz'
         ELSE 'yyy'
       END
  INTO @myNewVal

-или-

SET @myNewVal := IF(@jsonorder IS NULL,'zzz','yyy')
1 голос
/ 27 июня 2019

Оператор IF может использоваться только в сохраненных подпрограммах. Функцию IF можно использовать практически везде, где можно поместить выражение:

select id,history,active,jsonorder
    INTO @id,@history,@active,@jsonorder
    from myTable
    where uid = myUid;
insert into otherTable (colA)
    VALUES (IF(@jsonorder IS NULL, "zzz", "yyy"));

Откуда взялся myUid? 1011 *

Является ли otherTable шириной всего в один столбец? Или все остальные столбцы имеют значения по умолчанию?

(Я беспокоюсь, что вы слишком санировали вопрос.)

0 голосов
/ 26 июня 2019

Это решение для случаев, когда порядок равен нулю, но не для случаев, когда myUid не существует в вашей таблице

SELECT id,history,active, COALESCE(order,1)
INTO @id,@history,@active,@order
FROM myTable 
WHERE uid = myUid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...