2013-04-01 16 views
95

Mam następujące dane w moich "urządzeń" stółMySQL CONCAT zwraca NULL, jeśli jakieś pole zawiera NULL

affiliate_name affiliate_location model  ip    os_type os_version 

cs1    inter    Dell  10.125.103.25 Linux  Fedora 
cs2    inter    Dell  10.125.103.26 Linux  Fedora 
cs3    inter    Dell  10.125.103.27 NULL  NULL  
cs4    inter    Dell  10.125.103.28 NULL  NULL  

I wykonywany poniżej zapytania

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name 
FROM devices 

zwraca wynik podany poniżej

cs1-Dell-10.125.103.25-Linux-Fedora 
cs2-Dell-10.125.103.26-Linux-Fedora 
(NULL) 
(NULL) 

Jak wyjść z tego, aby zignorować NULL, a wynikiem powinno być

cs1-Dell-10.125.103.25-Linux-Fedora 
cs2-Dell-10.125.103.26-Linux-Fedora 
cs3-Dell-10.125.103.27- 
cs4-Dell-10.125.103.28- 

Odpowiedz

157

konwertować wartości NULL z pustym ciągiem przez otoczenie go COALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name 
FROM devices 
+0

Twoje rozwiązanie również działało, ale zawiera dużą ilość kodu. Jednak inne rozwiązanie podane przez Gerry'ego zawiera mniej kodu ... nieważne :) – neeraj

+5

Ta odpowiedź jest jednak zupełnie lepsza, koleś. Duuuude! – Ben

+1

Ta odpowiedź jest znacznie bardziej elastyczna niż wybrana. +1 – etherous

87

Korzystając CONCAT_WS Zamiast:

CONCAT_WS() nie pominąć pustych strun. Pomija jednak wszelkie wartości NULL po argumencie separatora.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices 
+0

Mam błąd .... FUNKCJA siteconfig_development.CONCATWS nie istnieje – neeraj

+1

@neeraj użyj CONCAT_WS() sprawdź proste demo http://sqlfiddle.com/#!2/d41d8/9885 – swapnesh

+0

+1 dla lepszego wyniku, który wyklucza - przyrostek. – neeraj

10
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name 
FROM devices 
+10

w mysql IFNULL() zamiast ISNULL() – bleuscyther

+0

Doskonale! Pracował jak urok, @bleuscyther! –

1

CONCAT_WS nadal produkuje null dla mnie jeśli pierwsze pole jest Null. Rozwiązałem to, dodając na początku ciąg znaków o zerowej długości, jak w CONCAT_WS ("", affiliate_name, "-", model, "-", ip, "-", os_type, "-", os_version) jednak CONCAT ("" , affiliate_name, '-', model, '-', ip, '-', os_type, '-', os_version) generuje wartość Null, gdy pierwsze pole ma wartość Null.

+0

Rozwiązanie podane przez Gerry działało idealnie dla mnie. – neeraj

+0

oczywiście, ponieważ pierwsze pole jest łańcuchem, z którym będzie się łączyć (WS = z ciągiem znaków) –

+1

CONCAT_WS jest skrótem od Concatenate With Separator. Pierwszy parametr jest separatorem i nie może mieć wartości NULL. Jest to prawdopodobnie to, czego potrzebujesz: 'CONCAT_WS (" - ", nazwa_partycji, model, ip, os_type, os_version) – encrest

4

Aby mieć taką samą elastyczność w CONCAT_WS jak w CONCAT (jeśli nie chcą tego samego separatora pomiędzy każdego członka na przykład), należy stosować następujące:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc) 
0

można użyć, jeśli oświadczenie jak poniżej

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices