ฉันจะตรวจสอบว่าสตริงเซิร์ฟเวอร์ Sql เป็นโมฆะหรือว่างเปล่าได้อย่างไร


225

ฉันต้องการตรวจสอบข้อมูล แต่ไม่ต้องสนใจถ้าว่างเปล่าหรือเปล่า ปัจจุบันแบบสอบถามมีดังนี้ ...

Select              
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id      

แต่ฉันอยากได้company.OfferText ถ้าlisting.Offertextมันเป็นสตริงว่างเปล่ารวมทั้งถ้ามันว่าง

ทางออกที่ดีที่สุดคืออะไร

คำตอบ:


433

ผมคิดแบบนี้:

SELECT 
  ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...

เป็นทางออกที่หรูหราที่สุด

และเพื่อทำลายมันลงในรหัสหลอก:

// a) NULLIF:
if (listing.Offer_Text == '')
  temp := null;
else
  temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
  result := true;
else
  result := false;

1
ฉันไม่สามารถตัดสินใจได้ว่าควรตอบคำตอบหรือลุงของคุณเพราะเขาดูเหมือนจะตอบก่อน แต่คำตอบของเขาได้รับการแก้ไขหลังจากที่คุณตอบ ฉันสิ้นสุดการ upvoting ทั้งสอง
Zecc

หาก listing.Offer_Text = '' จะผ่านเงื่อนไข NULLIF ฉันเสียใจ
Merritt

ตราบใดที่ company.Offer_Text ไม่เป็นโมฆะ แต่สิ่งนี้จะทำให้สิ่งที่ซับซ้อน ... =)
Coops

3
ไม่ควรที่เราจะใช้การตัดแต่งเพื่อให้แน่ใจว่าทุกอย่างเป็นไปตามแผน
irfandar

5
@irfandar - ถ้าคุณต้องการรักษาสตริงด้วยช่องว่างทั้งหมดให้เว้นไว้ให้ใช้ trim มิฉะนั้นสตริงที่มีช่องว่างทั้งหมดจะไม่ว่างเปล่า
Martin Ba

53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

ในตัวอย่างนี้ถ้าlisting.OfferTextเป็น NULL ฟังก์ชัน LEN () ควรส่งคืน NULL ด้วย แต่นั่นก็ยังไม่ใช่> 0

ปรับปรุง

ฉันได้เรียนรู้บางสิ่งบางอย่างใน 5 1/2 ปีนับตั้งแต่โพสต์สิ่งนี้และทำมันแตกต่างกันมากตอนนี้:

COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

นี้คล้ายกับคำตอบที่ยอมรับ แต่ก็มีทางเลือกในกรณีที่Company.OfferTextเป็นโมฆะ ไม่มีคำตอบในปัจจุบันอื่น ๆ ที่ใช้NULLIF()ทำเช่นนี้


สิ่งนี้ได้รับการโหวตเพิ่มขึ้นในวันนี้ ตอนนี้ฉันรู้วิธีที่ดีกว่าในการทำเช่นนี้มากกว่าคำตอบเดิม
Joel Coehoorn

34
Select              
CASE
    WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
    ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

18

นี่คือทางออกอื่น:

SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, 
FROM   tbl_directorylisting listing 
       INNER JOIN tbl_companymaster company 
         ON listing.company_id = company.company_id

14

คุณสามารถใช้ISNULLและตรวจสอบคำตอบกับผลลัพธ์ที่ทราบ:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST

12

ใน SQL Server 2012 คุณมีIIFเช่นคุณสามารถใช้มันได้

SELECT IIF(field IS NULL, 1, 0) AS IsNull

เช่นเดียวกับที่คุณสามารถตรวจสอบว่าเขตข้อมูลว่างเปล่า


6

ใช้ฟังก์ชัน LEN เพื่อตรวจสอบค่าว่างหรือค่าว่าง คุณสามารถใช้ LEN (@SomeVarcharParm)> 0 ได้ซึ่งจะคืนค่าเท็จหากค่าเป็น NULL, '' หรือ '' นี่เป็นเพราะ LEN (NULL) ส่งคืน NULL และ NULL> 0 ส่งคืนค่าเท็จ นอกจากนี้ LEN ('') จะส่งกลับค่า 0 ดูว่าตัวเองวิ่งอย่างไร:

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END

เมื่อคุณพูดว่า "... LEN (NULL) จะส่งกลับค่า NULL และ NULL> 0 กลับเป็นเท็จ ... " กฎที่แท้จริงคือทุกการทดสอบหรือการเปรียบเทียบกับ NULL return NULL!
Didier68

ถูกต้องที่น่าสังเกต แต่การทำงานเป็นทางลัดเพราะการเปรียบเทียบทำให้ค่า null รวมกันเป็นบูลีนที่ถูกต้องดังนั้นสิ่งนี้จะไม่ทำงานสำหรับการเปรียบเทียบผกผันของ LEN (NULL) = 0 เมื่อเราต้องการคืนค่าจริงเป็นโมฆะหรือว่างเปล่า .
Zach Johnson

4
Select              
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

บวกหนึ่งสำหรับคำตอบแรก (5 ปีต่อมา) เพื่อใช้ทั้งสองNULLIF()และรวมกันเป็นสตริงว่างถ้าcompany.OfferTextเป็นโมฆะ อย่างไรก็ตามการNULLIF()โทรที่2 ที่นี่ไม่ได้มีวัตถุประสงค์เหมือนกับว่าค่านั้นเป็นสตริงว่างคุณจะกลับมารวมกันเป็นสตริงว่างเปล่าได้
Joel Coehoorn

4

การผสมผสานอย่างง่ายของ COALESCE และ NULLIF ควรจะทำสิ่งต่อไปนี้:

SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

หมายเหตุ: เพิ่มสตริงว่างอื่นเป็นอาร์กิวเมนต์ COALESCE สุดท้ายหากคุณต้องการให้คำสั่งส่งคืนสตริงว่างแทนที่จะเป็น NULL หากค่าทั้งสองเป็น NULL


4

ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันเพิ่งเห็นหนึ่งโพสต์ก่อนหน้านี้ด้านบนและไม่ถูกต้อง

หากคุณใช้LEN (... )เพื่อตรวจสอบว่าเขตข้อมูลเป็นNULL หรือว่างเปล่าคุณจำเป็นต้องใช้ดังต่อไปนี้:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...

3

นี่เป็นวิธีแก้ปัญหา แต่ฉันไม่รู้ว่ามันดีที่สุด ....

Select              
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

3
SELECT              
    COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text,         
FROM 
    tbl_directorylisting listing  
    INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id

3

ไวยากรณ์นี้:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

ทำงานให้ฉันใน Microsoft SQL Server 2008 (SP3)


2

เพื่อป้องกันการบันทึกด้วยEmptyหรือNullค่าในผล SQL

เราสามารถเพิ่มได้ ..... WHERE Column_name != '' or 'null'


นี่จะเป็นพอร์ตแรกของการโทร แต่ถ้าคุณกำลังทำสิ่งต่าง ๆ เช่นการต่อข้อมูลจากหลาย ๆ คอลัมน์ในตารางสิ่งนี้จะแยกแถวแทนที่จะแสดงเพียงช่องว่างสำหรับคอลัมน์นั้น
Coops


0

[Column_name]> '' ไม่รวมค่า Null และสตริงว่าง มีช่องว่างระหว่างคำพูดเดียว


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