2009-06-11 10 views
13

Ho codice PHP 5 che accede a una tabella MyISAM su server MySQL 5. La query è simile al seguente:MySQL che restituisce un campo vuoto: CONCAT (nonEmpty1, empty2, nonEmpty3) = NULL

SELECT CONCAT(fName1,' ',mName2,' ',lName3) AS userName 
    FROM users 
    WHERE level > 10 

Quando non c'è MNAME compilato, mi aspetto di uscita come "nome cognome", ma sto ottenendo "" (stringa vuota) invece (il numero di righe restituite è corretta). Dove sto facendo un errore?

codice PHP:

<?php 
$result = mysql_query($the_above_query); 
while ($result_row = mysql_fetch_assoc($result)) { 
    // do stuff with the name 
    // except I'm getting empty strings in $result_row['userName'] 
} 

parte rilevante della struttura della tabella:

CREATE TABLE users { 
    /* -snip- */ 
    `fName1` varchar(50) default NULL,  
    `mName2` varchar(50) default NULL,  
    `lName3` varchar(50) default NULL,  
    `level` int(11) default 0,  
    /* -snip- */ 
} ENGINE=MyISAM DEFAULT CHARSET=utf8; 

(anche, è in questo modo (colonna concatenazione in MySQL) una buona idea, o devo recuperare le colonne PHP e unisciti a loro?)


Si scopre che stavo tornando un NULL; PHP considera un NULL restituito e una stringa vuota ("") allo stesso modo, dovresti confrontare con === per vedere la differenza.

risposta

25

da Google: http://bugs.mysql.com/bug.php?id=480

[23 maggio 2003 04:32] Alexander Keremidarski

Grazie per aver dedicato del tempo per scrivere a noi, ma questo non è un bug . Si prega di controllare due volte la documentazione disponibile presso http://www.mysql.com/documentation/ e le istruzioni su come segnalare un bug al http://bugs.mysql.com/how-to-report.php

Questo comportamento è doccumented della funzione CONCAT().

da manuale il capitolo 6.3.2 Funzioni stringa

CONCAT (str1, str2, ...) Restituisce la stringa che risulta dalla concatenazione degli argomenti. Restituisce NULL se qualsiasi argomento è NULL

Utilizzare CONCAT_WS() invece o avvolgere i parametri di misura Nullabili con la funzione IFNULL().

documentazione e utilizzo per CONCAT_WS: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

+0

Bello trovare su 'CONCAT_WS()' – redolent

11

In MySQL concatenare qualsiasi stringa in un valore NULL risultati in NULL. Devi controllare per NULL prima concatenate utilizzando IFNULL:

SELECT CONCAT(IFNULL(fName1,''),' ',IFNULL(mName2,''),' ',IFNULL(lName3,'')) AS userName 
FROM users 
WHERE level > 10 
16

Dalla documentazione MySQL

CONCAT() restituisce NULL se nessun argomento è NULL.

si desidera utilizzare CONCAT_WS()

CONCAT_WS(separator,str1,str2,...) 

Ma cosa migliore da fare è quello di tirare semplicemente indietro e usare php causa, se avete bisogno di un formato diverso o solo uno di quei campi in seguito dovrete per effettuare un'altra chiamata db

+0

+1: e grazie! –

+0

+1 e grande grazie - non lo sapevo mai esistito, ma ne ho bisogno stasera! – dadwithkids

3

Questa è stata la soluzione che ho trovato con la risposta di Keeper e Ersatz. Sistema non mi permette di votare voi ragazzi fino però :(

CONCAT_WS(IFNULL(ts_usr_nameDetails.first_name,''),' ',IFNULL(ts_usr_lib_connectionNameDetails.first_name,'')) AS composerName

Questo ha permesso per alcuni risultati sorprendenti

+0

Se si utilizza CONCAT_WS e il separatore (primo argomento) non è NULL, non è necessario utilizzare IFNULL. '" CONCAT_WS() non salta le stringhe vuote, ma salta tutti i valori NULL dopo l'argomento separatore.Se il separatore è NULL, il risultato è NULL. "' Vedi http://dev.mysql.com/doc/ refman/5.0/it/string-functions.html # function_concat-ws – dvb

1

Questa è una risposta sulla base della soluzione di cui sopra da @chocojosh e un'altra domanda qui: MySQL/SQL: Update with correlated subquery from the updated table itself

Avevo un problema simile, ma stavo cercando di concatolare un gruppo di group_concats e alcuni erano NULL che ha causato l'intera riga NULL. L'obiettivo era quello di posizionare i dati da altre tabelle in un singolo campo nella tabella principale per consentire ricerche di testo completo.

Ecco l'SQL che ha funzionato. Nota il primo parametro per concat_ws che ho creato '', questo consentito per gli spazi tra i valori per il campo fulltext.

Spero che questo aiuti qualcuno.

update 
products target 
INNER JOIN 
(
    select p.id, 
    CONCAT_WS(
    ' ', 
     (select GROUP_CONCAT(field SEPARATOR ' ') from table1 where productId = p.id), 
     p.title,' ', 
     (select GROUP_CONCAT(field, ' ', descriptions SEPARATOR ' ') from table2 where productId = p.id), 
     (select GROUP_CONCAT(field SEPARATOR ' ') from table3 where productId = p.id), 
     (select GROUP_CONCAT(field, ' ', catno SEPARATOR ' ') from table4 where productId = p.id), 
     (select GROUP_CONCAT(field SEPARATOR ' ') from table5 where productId = p.id), 
     (select GROUP_CONCAT(field SEPARATOR ' ') from table6 where productId = p.id), 
     (select GROUP_CONCAT(field SEPARATOR ' ') from table7 where productId = p.id) 
    ) as ft 
    from products p 
) as source 
on target.id = source.id 
set target.fulltextsearch = source.ft 
1

si poteva anche la funzione COALESCE() di restituire il primo valore non nullo. In questo modo:

SELECT CONCAT(fName1,COALESCE(CONCAT(' ',mName2,' '),' '),lName3) AS userName 
    FROM users 
    WHERE level > 10 

Questo sarebbe anche messo solo uno spazio se non ci fosse secondo nome e uno spazio prima e dopo se ci fosse un secondo nome.

di riferimento per questa funzione sono disponibili all'indirizzo: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

+0

Questa è la migliore risposta IMO poiché puoi facilmente unire un nullo in una stringa vuota: concat (address1, '', coalesce (unit, ''), ' ', città,', ', stato,' ', zip) come indirizzo – Jage

Problemi correlati