MySql, IFNULL (), COALSESCE () в строке не заменяет - PullRequest
13 голосов
/ 18 января 2012

Описание:

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

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

IFNULL () ведет себя так же.

Что я делаю не так?

Ответы [ 4 ]

22 голосов
/ 18 января 2012

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

SELECT
  COALESCE(NULLIF(main_table.title_column, ''), 'no name') AS title
FROM main_table;
4 голосов
/ 18 января 2012

В MySQL строка NULL и пустая ('') строка не одно и то же.

У вас есть несколько вариантов, для согласованности я использую CASE ...

CASE WHEN main_table.title_column = '' THEN 'no name' ELSE main_table.title_column END

Другими параметрами могут быть COALESCE (NULLIF ()), показанный в другом ответе (который использует NULLIF (), чтобы превратить пустые строки в NULL, а затем использует объединение, как вы хотели) .

Или, возможно, просто IIF (), чтобы сократить оператор CASE ...

IIF(main_table.title_column = '', 'no name', main_table.title_column)
2 голосов
/ 05 апреля 2013

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

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
1 голос
/ 18 января 2012

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

SELECT IF((TRIM(main_table.title_column) = ''),'no name', COALESCE(main_table.title_column, 'no name')) AS title FROM main_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...