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

MySql, IFNULL(), COALSESCE() для строки, не заменяющей

Описание:

Мое утверждение должно заменить каждый пустой title_column "no name" , но это не так:

SELECT
  COALESCE(main_table.title_column, 'no name') AS title
FROM main_table;

IFNULL() ведет себя одинаково.

Что я делаю неправильно?

4b9b3361

Ответ 1

COALESCE и IFNULL заменяют только значения NULL, ваша таблица содержит пустые строки:

SELECT
  COALESCE(NULLIF(main_table.title_column, ''), 'no name') AS title
FROM main_table;

Ответ 2

В 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)

Ответ 3

Если вы предпочитаете функциональный способ предоставления решений вы всегда можете использовать это:

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

Ответ 4

использовали это решение для MySql,

SELECT IF((TRIM(main_table.title_column) = ''),'no name', COALESCE(main_table.title_column, 'no name')) AS title FROM main_table