Я знаю, что coalesce вернет первое ненулевое значение, которое передается ему. есть ли что-то похожее, которое вернет первое не пустое/не ложное значение?
Пример:
select FunctionIWant(0,'','banana') as fruit; //returns banana.
Я знаю, что coalesce вернет первое ненулевое значение, которое передается ему. есть ли что-то похожее, которое вернет первое не пустое/не ложное значение?
Пример:
select FunctionIWant(0,'','banana') as fruit; //returns banana.
Используйте инструкцию 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
Вы можете сделать NULL из пустой строки в MySQL:
SELECT coalesce(NULLIF(email, ''), '[email protected]') FROM users WHERE id=1000000;
В 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)
Вы можете, конечно, адаптировать значение разделителя строк, чтобы не было конфликтов с вашими установленными значениями.
Это сработало для меня:
SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable;