การเชื่อมต่อสตริงเซิร์ฟเวอร์ SQL กับ Null


86

ฉันกำลังสร้างคอลัมน์จากการคำนวณข้ามเขตข้อมูลซึ่งบางช่องอาจเป็นโมฆะ

ปัญหาคือถ้าฟิลด์ใดฟิลด์หนึ่งเป็นโมฆะคอลัมน์ที่คำนวณทั้งหมดจะเป็นโมฆะ ฉันเข้าใจจากเอกสารของ Microsoft ว่าสิ่งนี้เป็นสิ่งที่คาดหวังและสามารถปิดได้ผ่านการตั้งค่า SET CONCAT_NULL_YIELDS_NULL อย่างไรก็ตามฉันไม่ต้องการเปลี่ยนลักษณะการทำงานเริ่มต้นนี้เนื่องจากฉันไม่ทราบผลกระทบของมันในส่วนอื่น ๆ ของ SQL Server

มีวิธีให้ฉันตรวจสอบว่าคอลัมน์เป็นโมฆะหรือไม่และต่อท้ายเฉพาะเนื้อหาภายในสูตรคอลัมน์ที่คำนวณแล้วหากไม่ใช่ค่าว่าง


2
คำตอบที่ยอมรับนั้นถูกต้องในขณะที่ถามคำถาม แต่สำหรับทุกคนใน SQL Server 2012 และใหม่กว่า (และขั้นตอนนี้ควรเป็นทุกคน) คำตอบของ @ Martin-Smiths นั้นดีที่สุดเนื่องจากจัดการกับ null โดยอัตโนมัติ
Dowlers

คำตอบ:


144

คุณสามารถใช้ได้ ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')

หากค่าของคอลัมน์ / นิพจน์เป็นค่า NULL ค่าที่สองที่ระบุ (ที่นี่: สตริงว่าง) จะถูกใช้แทน


23
"Coalesce" เป็นชื่อฟังก์ชันมาตรฐาน ANSI แต่ ISNULL สะกดง่ายกว่า
Philip Kelley

1
และ ISNULL ดูเหมือนจะเร็วกว่าบน SQL Server ด้วยดังนั้นหากคุณต้องการใช้ในฟังก์ชันที่เชื่อมสตริงเข้ากับคอลัมน์ที่คำนวณคุณอาจละทิ้งมาตรฐาน ANSI และเลือกใช้ความเร็ว (ดู Adam Machanic: sqlblog.com / blogs / adam_machanic / archive / 2006/07/12 / … )
marc_s

เพิ่งใช้แบบสอบถาม Isnull (,) นี้มันทำให้เกิดความเสียหายอย่างมากเมื่อฉันเชื่อมค่าเข้าด้วยกันและถ้าหนึ่งในนั้นเป็นโมฆะทุกอย่างก็กลายเป็นโมฆะ
Sizons

การใช้ISNULL()เป็นวิธีแก้ปัญหาที่ดี แต่ตั้งแต่ SQL Server 2012 เป็นต้นไปคุณยังสามารถใช้CONCATฟังก์ชันเพื่อให้ได้ผลลัพธ์เช่นเดียวกัน:CONCAT(@Column1, @Column2)
Muhammad Musavi

2
เป็นที่น่าสังเกตว่าหากคุณต้องการสลับnullสิ่งอื่นที่ไม่ใช่สตริงว่างกล่าวคือIsNull(@Column1, 'NULLVALUE')ด้วยIsNullความยาวสตริงการแทนที่จะ จำกัด อยู่ที่ความยาวของคอลัมน์ที่ถูกแทนที่ในขณะที่ไม่ได้อยู่ด้วยCoalesce
เจมี่

59

จาก SQL Server 2012 ทั้งหมดนี้ง่ายกว่ามากด้วยCONCATฟังก์ชัน

ถือว่าNULLเป็นสตริงว่าง

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/

สำหรับเวอร์ชันเก่าคุณจะได้รับ "" CONCAT "ไม่ใช่ชื่อฟังก์ชันในตัวที่รู้จัก" ดังนั้นให้ใช้ COALESCE
Savage

3
@Savage - COALESCE จะไม่ทำงานเพราะมันไม่เชื่อมต่อกันมันจะส่งคืนอาร์กิวเมนต์แรกที่ไม่ใช่ค่าว่าง
codeulike

30

ใช้เชื่อมต่อกัน แทนที่จะyour_columnใช้COALESCE(your_column, ''). สิ่งนี้จะส่งคืนสตริงว่างแทน NULL


OP ต้องการเชื่อมสตริงเข้าด้วยกัน COALESCE จะไม่ทำเช่นนั้น
codeulike

12

ใช้

SET CONCAT_NULL_YIELDS_NULL  OFF 

และการต่อค่า null กับสตริงจะไม่ทำให้เกิด null

โปรดทราบว่านี่เป็นตัวเลือกที่เลิกใช้แล้วโปรดหลีกเลี่ยงการใช้ ดูเอกสารสำหรับรายละเอียดเพิ่มเติม


11

คุณยังสามารถใช้ CASE - โค้ดของฉันด้านล่างตรวจสอบทั้งค่า null และสตริงว่างและเพิ่มตัวแยกเฉพาะเมื่อมีค่าที่จะปฏิบัติตาม:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 

8

ฉันแค่อยากจะมีส่วนร่วมในสิ่งนี้หากมีคนกำลังมองหาความช่วยเหลือในการเพิ่มตัวคั่นระหว่างสตริงขึ้นอยู่กับว่าฟิลด์นั้นเป็นโมฆะหรือไม่

ดังนั้นในตัวอย่างของการสร้างที่อยู่บรรทัดเดียวจากฟิลด์แยกต่างหาก

address1 , Address2 , Address3 , เมือง , รหัสไปรษณีย์

ในกรณีของฉันฉันมีคอลัมน์จากการคำนวณต่อไปนี้ซึ่งดูเหมือนว่าจะทำงานได้ตามที่ฉันต้องการ:

case 
    when [Address1] IS NOT NULL 
    then (((          [Address1]      + 
          isnull(', '+[Address2],'')) +
          isnull(', '+[Address3],'')) +
          isnull(', '+[City]    ,'')) +
          isnull(', '+[PostCode],'')  
end

หวังว่าจะช่วยใครสักคน!


มีการถ่ายคร่อมที่ซ้อนกันอยู่เล็กน้อยซึ่งสามารถถอดออกได้ เคล็ดลับอีกประการหนึ่งคือคุณสามารถลบคำสั่ง case ได้เช่นกันหาก address1 เป็นโมฆะนิพจน์ทั้งหมดจะประเมินเป็น null (แม้ว่าการมีคำสั่ง case จะดึงดูดความสนใจว่าสิ่งนี้สามารถเกิดขึ้นได้)
Alternator


1

ฉันก็มีปัญหากับเรื่องนี้เช่นกัน ไม่สามารถใช้งานได้โดยใช้กรณีตัวอย่างด้านบน แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),'  ',' ')

แทนที่แก้ไขช่องว่างสองช่องที่เกิดจากการเชื่อมช่องว่างเดี่ยวโดยไม่มีอะไรคั่นระหว่างช่องว่าง r / ltrimกำจัดช่องว่างที่ปลาย


0

ใน Sql Server:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'xyz@xyz.com')

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.

รหัสหลัง:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')

0

ตัวอย่างนี้จะช่วยคุณจัดการกับประเภทต่างๆในขณะที่สร้างคำสั่งแทรก

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.