필드에 NULL이 포함 된 경우 MySQL CONCAT는 NULL을 반환합니다.


163

내 테이블 "장치"에 다음 데이터가 있습니다.

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    

아래 쿼리를 실행했습니다.

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

아래 주어진 결과를 반환합니다

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

NULL을 무시하고 결과는 다음과 같아야합니다.

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-

답변:


279

NULL빈 문자열로 값을 감싸서 변환하십시오 .COALESCE

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

1
장치에서 모델로 CONCAT (if (affiliate_name is null, '', affiliate_name), '-', if (model is null, '', affiliate_name))을 선택하면 사용할 수 있습니다
Dinesh Rabara

6
내가 궁금했던 것처럼, COALESCE함수가하는 일 : 함수에 NULL전달 된 첫 번째 비 값 매개 변수를 반환합니다 (또는 NULL모든 매개 변수가 인 경우 NULL). 빈 문자열을 두 번째 매개 변수로 전달하면 반환되지 않습니다 NULL.
조.

3
같은 구문을 사용하여 MySQL이 IFNULL있다 (ARG, 기본값) 대신에 COALESCE
바실리 Suricov

126

대신 CONCAT_WS 를 사용하십시오 .

CONCAT_WS ()는 빈 문자열을 건너 뛰지 않습니다. 그러나 separator 인수 뒤의 NULL 값은 건너 뜁니다.

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

죄송합니다 neeraj 내가 Concat와 WS 사이의 '_'를 놓쳤습니다. CONCAT_WS ()로 다시 시도하십시오. 답변을 확인하십시오.
Gurmeet

8
중간 필드 중 하나가 NULL 인 경우이 솔루션은 완전한 "열"(구분 기호 포함)을 숨 깁니다. 따라서이 답변은 마지막 필드 만 NULL이 될 수 있다고 가정하면 정확합니다. 필요에 따라 아래 COALEASE () 답변이 더 나을 수 있습니다.
Jannes

모든 멤버를 동일한 구분 기호로 구분하려는 경우에만 작동합니다. CONCAT에는이 제한이 없습니다. 여기에 답변으로 솔루션을 게시했습니다
patrick

12

CONCAT에서와 같이 CONCAT_WS에서 동일한 유연성을 가지려면 (예를 들어 모든 멤버간에 동일한 구분 기호를 원하지 않는 경우) 다음을 사용하십시오.

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

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

15
ISNULL () 대신 mysql IFNULL ()에서
Jeffrey Nicholson Carré

10

CONCAT_WS첫 번째 필드가 Null이면 여전히 null을 생성합니다. 처음과 같이 길이가 0 인 문자열을 추가 하여이 문제를 해결했습니다.

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

하나

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

첫 번째 필드가 Null 인 경우 Null을 생성합니다.


분명히, 첫 번째 필드는 그것이 연결될 문자열이기 때문에 (WS = string)
Bouke Versteegh

2
CONCAT_WS는 Concatenate With Separator의 약자입니다. 첫 번째 매개 변수는 구분 기호이며 null 일 수 없습니다. 이것은 아마도 당신이 원하는 것입니다 :CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

2

아래처럼 if 문을 사용할 수 있습니다

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.