2012-01-18 7 views
13

Opis:MySQL, IFNULL(), COALSESCE() na ciąg nie zastępująca

moje oświadczenie powinno zastąpić każdą pusty title_column z 'bez nazwy', ale nie:

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

IFNULL() zachowuje się w ten sam sposób.

Co robię źle?

+3

Czy to możliwe, że widzisz puste wartości ciągów zamiast wartości zerowych? – Ilion

+0

oczywiście, że tak jest. i inny użytkownik opublikował rozwiązanie ... – kiltek

Odpowiedz

21

COALESCE i IFNULL substytutem tylko NULL wartości, tabela wydaje się zawierać pustych ciągów:

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

W MySQL NULL ciąg i pusty ('') ciąg nie to samo.

masz kilka opcji, o konsystencji używam razie ...

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

Inne opcje może być COALESCE (NULLIF()) pokazano na inną odpowiedź (który używa NULLIF(), aby włączyć pusty łańcuchy do NULL, a następnie używają się w celu połączenia się, tak jak chciałeś).

A może po prostu IIF(), aby skrócić case ...

IIF(main_table.title_column = '', 'no name', main_table.title_column) 
1

stosować to rozwiązanie dla MySQL,

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

Jeśli wolisz funkcjonalny sposób dając rozwiązania można zawsze to wykorzystać:

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$$ 

Zastosowanie:

SELECT IfNullOrEmpty(t.FieldName,'No Name Given') as Name FROM cms_Table t