Подтвердить что ты не робот

MySQL, эквивалент coulece для пустых значений?

Я знаю, что coalesce вернет первое ненулевое значение, которое передается ему. есть ли что-то похожее, которое вернет первое не пустое/не ложное значение?

Пример:

select FunctionIWant(0,'','banana') as fruit;  //returns banana.
4b9b3361

Ответ 1

Используйте инструкцию ANSI CASE/выражение:

SELECT CASE 
         WHEN LENGTH(col) = 0 OR col IS NULL THEN 'banana'
         ELSE col
       END AS fruit

В SQL не существует логического или MySQL. MySQL фактически сохраняет значение как INT, значения ноль или один:

SELECT CASE 
         WHEN col = 0 THEN 'banana'
         ELSE col
       END AS fruit

Ответ 2

Вы можете сделать NULL из пустой строки в MySQL:

SELECT coalesce(NULLIF(email, ''), '[email protected]') FROM users WHERE id=1000000;

Ответ 3

В MySQL нет такой функции, но вы можете создать свою собственную сохраненную функцию. Основная трудность здесь заключается в том, что количество параметров, передаваемых функции, может меняться.

Одним из возможных решений может быть передача строки с набором значений, разделенных разделителем, с помощью функции CONCAT_WS (см. функция CONCAT_WS()). Вам также нужно будет определить разделитель строк, если ваш разделитель будет включен в одно из значений набора.

Вот пример script:

DELIMITER |;
CREATE FUNCTION MY_COALESCE (
     p_set_string TEXT
    ,p_delimiter CHAR(1)
  ) RETURNS TEXT
    DETERMINISTIC
BEGIN

    RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(
              REPLACE(REPLACE(
                      CONCAT(p_delimiter,p_set_string,p_delimiter)
                     ,CONCAT(p_delimiter,'0',p_delimiter),'')
                 ,CONCAT(p_delimiter,p_delimiter),'')
             ,p_delimiter,2),p_delimiter,-1)
    ;
END;
|;
DELIMITER ;

SET @separator=',', @delimiter='$';
SELECT
  MY_COALESCE(
      CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana')
     ,@delimiter
    ) as fruit
;

При запуске предыдущего script вы получите следующий вывод:

MySQL> --------------
MySQL> SET @separator=',', @delimiter='$'
MySQL> --------------
MySQL> 
MySQL> Query OK, 0 rows affected (0.00 sec)
MySQL> 
MySQL> --------------
MySQL> SELECT
MySQL>   MY_COALESCE(
MySQL>       CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana')
MySQL>      ,@delimiter
MySQL>     ) as fruit
MySQL> --------------
MySQL> 
MySQL> +--------+
MySQL> | fruit  |
MySQL> +--------+
MySQL> | banana |
MySQL> +--------+
MySQL> 1 row in set (0.02 sec)

Вы можете, конечно, адаптировать значение разделителя строк, чтобы не было конфликтов с вашими установленными значениями.

Ответ 4

Это сработало для меня:

SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable;