2012-01-18 14 views
13

Descrizione:MySql, IFNULL(), COALSESCE() sulla stringa non sostituire

La mia dichiarazione dovrebbe sostituire ogni vuoto title_column con 'senza nome', ma non:

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

IFNULL() si comporta allo stesso modo.

Cosa sto sbagliando?

+3

Potrebbe essere che stai visualizzando valori di stringa vuoti invece di valori nulli? – Ilion

+0

ovviamente, questo è il caso. e un altro utente ha postato la soluzione ... – kiltek

risposta

21

COALESCE e IFNULL sostituto solo NULL valori, il vostro tavolo sembrano contenere stringhe vuote:

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

In MySQL una stringa NULL e di un ('') stringa vuota, non sono la stessa cosa.

Hai alcune opzioni, per la coerenza io uso CASE ...

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

Altre opzioni potrebbero essere la COALESCE (NULLIF()) mostrato un'altra risposta (che utilizza NULLIF() per accendere vuoto stringe in NULL e quindi usa la coalizione come desiderato).

O forse solo IIF() per abbreviare l'istruzione CASE ...

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

utilizzato questa soluzione per MySql,

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

Se si preferisce un modo funzionale di dare soluzioni è possibile utilizzare sempre questo:

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

uso:

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