MySQL CONCAT ส่งคืน NULL ถ้าเขตข้อมูลใดมี 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 (ถ้า (affiliate_name เป็นโมฆะ, '', affiliate_name), '-' ถ้า (แบบจำลองเป็นโมฆะ, '', affiliate_name)) เป็นแบบจำลองจากอุปกรณ์
Dinesh Rabara

6
สำหรับสิ่งที่สงสัยเช่นเดียวกับที่ฉันทำสิ่งที่COALESCEฟังก์ชั่น: มันจะส่งกลับNULLพารามิเตอร์ที่ไม่ใช่ค่าแรกผ่านไป (หรือNULLถ้าพารามิเตอร์ทั้งหมดNULL) NULLโดยผ่านสตริงที่ว่างเปล่าเป็นพารามิเตอร์ที่สองคุณจะรับประกันว่ามันจะไม่กลับมา
โจ

3
mysql มี IFNULL (หาค่าเริ่มต้น) แทน COALESCE ด้วยไวยากรณ์เดียวกัน
Vasilii Suricov

126

ใช้CONCAT_WSแทน:

CONCAT_WS () ไม่ข้ามสตริงว่าง อย่างไรก็ตามมันจะข้ามค่า 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_WS เช่นเดียวกับใน CONCAT (หากคุณไม่ต้องการให้มีตัวคั่นที่เหมือนกันระหว่างสมาชิกทุกคน) ให้ใช้สิ่งต่อไปนี้:

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


11

CONCAT_WSยังคงสร้าง null สำหรับฉันถ้าเขตข้อมูลแรกเป็นค่าว่าง ฉันแก้ไขได้โดยเพิ่มสตริงความยาวเป็นศูนย์ที่จุดเริ่มต้นเช่นเดียวกับ

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

อย่างไรก็ตาม

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

สร้าง Null เมื่อฟิลด์แรกเป็น Null


เห็นได้ชัดว่าเนื่องจากเขตข้อมูลแรกคือสตริงที่มันจะเชื่อมต่อกับ (WS = กับสตริง)
Bouke Versteegh

2
CONCAT_WS ย่อมาจาก Concatenate With Separator พารามิเตอร์แรกคือตัวคั่นและไม่สามารถเป็นค่าว่างได้ นี่อาจเป็นสิ่งที่คุณต้องการแทน:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

2

คุณสามารถใช้ถ้าคำสั่งเช่นด้านล่าง

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.