MySQL CONCAT trả về NULL nếu bất kỳ trường nào chứa NULL


162

Tôi có dữ liệu sau trong bảng "thiết bị" của mình

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    

Tôi đã thực hiện bên dưới truy vấn

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

Nó trả về kết quả được đưa ra dưới đây

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

Làm thế nào để đi ra khỏi điều này để nó nên bỏ qua kết quả NULL VÀ

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-

Câu trả lời:


278

chuyển đổi các NULLgiá trị với chuỗi rỗng bằng cách gói nó vàoCOALESCE

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

1
Bạn có thể sử dụng nếu chọn CONCAT (if (link_name là null, '', link_name), '-', if (model là null, '',
link_name

6
Đối với những người thắc mắc, như tôi đã làm, COALESCEhàm này làm gì: nó trả về NULLtham số không giá trị đầu tiên được truyền cho nó (hoặc NULLnếu tất cả các tham số là NULL). Bằng cách chuyển một chuỗi rỗng làm tham số thứ hai, bạn đảm bảo nó sẽ không trả về NULL.
Jo.

3
mysql có IFNULL (arg, mặc định) thay vì COALESCE với cùng một cú pháp
Vasilii Suricov

126

Sử dụng CONCAT_WS thay thế:

CONCAT_WS () không bỏ qua các chuỗi trống. Tuy nhiên, nó không bỏ qua bất kỳ giá trị NULL nào sau đối số dấu phân cách.

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

Xin lỗi neeraj tôi đã bỏ lỡ '_' giữa Concat và WS Vui lòng thử lại với CONCAT_WS (). Tôi đã cập nhật câu trả lời, vui lòng kiểm tra,
Gurmeet

8
Lưu ý rằng giải pháp này ẩn một "cột" hoàn chỉnh (bao gồm cả dấu phân cách) nếu một trong các trường ở giữa là NULL. Vì vậy, câu trả lời này chỉ đúng khi cho rằng chỉ có (các) trường cuối cùng có thể là NULL. Tùy thuộc vào nhu cầu của bạn, câu trả lời COALEASE () dưới đây có thể tốt hơn.
Jannes

Điều này chỉ hoạt động nếu bạn muốn mọi thành viên được phân tách bằng cùng một dấu phân cách. CONCAT không có giới hạn này. Tôi đã đăng giải pháp như một câu trả lời ở đây
patrick

12

Để có tính linh hoạt tương tự trong CONCAT_WS như trong CONCAT (nếu bạn không muốn có cùng một dấu phân cách giữa mọi thành viên), hãy sử dụng như sau:

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
trong mysql IFNULL () thay vì ISNULL ()
Jeffrey Nicholson Carré

10

CONCAT_WSvẫn tạo null cho tôi nếu trường đầu tiên là Null. Tôi đã giải quyết điều này bằng cách thêm một chuỗi có độ dài bằng không ở đầu như trong

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

Tuy nhiên

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

tạo Null khi trường đầu tiên là Null.


rõ ràng, bởi vì trường đầu tiên là chuỗi mà nó sẽ nối với (WS = với chuỗi)
Bouke Versteegh

2
CONCAT_WS là viết tắt của Ghép nối với Dấu phân cách. Tham số đầu tiên là dấu phân cách và không thể là null. Đây có lẽ là những gì bạn muốn thay vào đó:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
bắt giữ

2

bạn có thể sử dụng if statement như bên dưới

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.