Описание:
Мое утверждение должно заменить каждый пустой title_column "no name" , но это не так:
SELECT
COALESCE(main_table.title_column, 'no name') AS title
FROM main_table;
IFNULL() ведет себя одинаково.
Что я делаю неправильно?
Описание:
Мое утверждение должно заменить каждый пустой title_column "no name" , но это не так:
SELECT
COALESCE(main_table.title_column, 'no name') AS title
FROM main_table;
IFNULL() ведет себя одинаково.
Что я делаю неправильно?
COALESCE
и IFNULL
заменяют только значения NULL
, ваша таблица содержит пустые строки:
SELECT
COALESCE(NULLIF(main_table.title_column, ''), 'no name') AS title
FROM main_table;
В MySQL строка NULL
и пустая строка (''
) - это не одно и то же.
У вас есть несколько вариантов, для согласования я использую CASE...
CASE WHEN main_table.title_column = '' THEN 'no name' ELSE main_table.title_column END
Другими параметрами могут быть COALESCE (NULLIF()), показанные на другом ответе (который использует NULLIF(), чтобы превращать пустые строки в NULL, а затем использует coalesce, как вы хотели).
Или, возможно, просто IIF(), чтобы сократить оператор CASE...
IIF(main_table.title_column = '', 'no name', main_table.title_column)
Если вы предпочитаете функциональный способ предоставления решений вы всегда можете использовать это:
DELIMITER $$
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
-- Note: add your server side comments to remember what this routine does on your Api
-- --------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS `IfNullOrEmpty`$$
CREATE FUNCTION `IfNullOrEmpty`(s TEXT, value TEXT) RETURNS TEXT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
IF ( (s is null) OR (trim(s) = '') ) THEN
return value;
END IF;
return s;
END$$
Использование:
SELECT IfNullOrEmpty(t.FieldName,'No Name Given') as Name FROM cms_Table t
использовали это решение для MySql,
SELECT IF((TRIM(main_table.title_column) = ''),'no name', COALESCE(main_table.title_column, 'no name')) AS title FROM main_table