2011-10-13 54 views
17

Trong đoạn mã dưới đây, tôi tạo trường Địa chỉ bằng cách nối các phần khác nhau của một địa chỉ.CONCAT có điều kiện với các giá trị NULL hoặc rỗng có thể

Tuy nhiên, nếu ví dụ address2 bị trống, dấu trang , sẽ vẫn được nối vào Địa chỉ.

Điều này có nghĩa là nếu tất cả các trường trống, tôi sẽ có kết quả là ,,,,.

Nếu address1"House Number" và mọi thứ khác trống, tôi kết thúc bằng House Number,,,,.

CONCAT(COALESCE(address1,'') , ', ' , 
     COALESCE(address2,'') , ', ' , 
     COALESCE(address3,'') , ', ' , 
     COALESCE(city,'')  , ', ' , 
     COALESCE(zip, '') 
) AS Address, 

Có một số cách có điều kiện đặt dấu phẩy giữa các phần địa chỉ chỉ khi nội dung của phần địa chỉ không trống.

Chẳng hạn như một cái gì đó dọc theo dòng (pseudo-code) IF(address1) is NULL use '' ELSE use ','

Cảm ơn bạn.

Trả lời

24

Hãy xem hàm CONCAT_WS. Nó thực hiện chính xác những gì bạn muốn.

+0

Cảm ơn bạn, đây chính xác là những gì tôi cần. – Houdmont

+0

Rất vui được liên kết với tài liệu. – bloodyKnuckles

3

Sử dụng CONCAT_WS như Mat nói là một ý tưởng rất tốt, nhưng tôi nghĩ rằng tôi muốn làm điều đó một cách khác nhau, với lộn xộn IF() báo cáo:

CONCAT(COALESCE(address1,''), IF(LENGTH(address1), ', ', ''), 
     COALESCE(address2,''), IF(LENGTH(address2), ', ', ''), 
     COALESCE(address3,''), IF(LENGTH(address3), ', ', ''), 
     COALESCE(city,''), IF(LENGTH(city), ', ', ''), 
     COALESCE(zip,''), IF(LENGTH(address1), ', ', ''), 
) AS Address, 

Các IF() s kiểm tra nếu lĩnh vực này có chiều dài và nếu như vậy trả về dấu phẩy. Nếu không, nó sẽ trả về một chuỗi rỗng.

+0

Cảm ơn bạn đã đề xuất, điều này hoạt động tốt, nhưng khi bạn chỉ ra, sử dụng CONCAT_WS thậm chí còn đơn giản hơn nên tôi đã bị mắc kẹt với điều đó. – Houdmont

26
CONCAT_WS(', ', 
     IF(LENGTH(`address1`),`address1`,NULL), 
     IF(LENGTH(`address2`),`address2`,NULL), 
     IF(LENGTH(`address3`),`address3`,NULL), 
     IF(LENGTH(`city`),`city`,NULL), 
     IF(LENGTH(`zip`),`zip`,NULL) 
) 
+1

Giải pháp này là thanh lịch. Việc sử dụng hàm LENGTH để trả về NULL, điều này xử lý một cách duyên dáng tình huống có một chuỗi rỗng.Một chuỗi rỗng không phải là NULL, vì vậy concat_ws sẽ bao gồm không đúng một dấu phân cách trước các chuỗi rỗng. Rất đẹp! – kd4ttc

+1

Và từ một người dùng @Martin, người chỉ trả lời một câu hỏi về stackoverflow, chỉ với 11 điểm danh tiếng. Tôi khiêm nhường. – kd4ttc

+0

Cảm ơn rất nhiều. Chính xác những gì tôi đang tìm kiếm. tiết kiệm rất nhiều thời gian – Saurabh

3

thử với MAKE_SET

SELECT MAKE_SET(11111,`address1`,`address2`,`address3`,`city`,`zip`) AS Address 

Nó sẽ trả về một chuỗi với tất cả các giá trị NOT NULL ngăn cách bởi ,

0

Như nó được đề cập rõ trong doc rằng:

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

Chúng ta có thể loại bỏ khoảng trống bằng NULL được thanh lịch xử lý bởi CONCAT_WS.

CONCAT_WS(', ', 
     IF(`address1` != '', `address1`, NULL), 
     IF(`address2` != '', `address2`, NULL), 
     IF(`address3` != '', `address3`, NULL), 
     IF(`city` != '', `city, NULL), 
     IF(`zip` != '', `zip, NULL) 
) 
Các vấn đề liên quan