Làm cách nào để kiểm tra xem chuỗi máy chủ Sql có rỗng hay không


225

Tôi muốn kiểm tra dữ liệu, nhưng bỏ qua nó nếu nó rỗng hoặc trống. Hiện tại truy vấn như sau ...

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      

Nhưng tôi muốn lấy company.OfferText nếu listing.Offertextlà một chuỗi rỗng, cũng như nếu nó là null.

Giải pháp tốt nhất là gì?

Câu trả lời:


433

Tôi nghĩ rằng đây:

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

là giải pháp thanh lịch nhất.

Và để phá vỡ nó một chút trong mã giả:

// 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
Tôi không thể quyết định liệu tôi nên nâng cao câu trả lời của bạn hay của bác, vì dường như anh ấy đã trả lời trước, nhưng câu trả lời của anh ấy đã được chỉnh sửa sau khi bạn trả lời. Tôi đã kết thúc nâng cấp cả hai.
Zecc

nếu niêm yết. Offerer_Text = '', nó vượt qua điều kiện NULLIF. Tôi buồn bã.
Merritt

Miễn là công ty. Offerer_Text không phải là null nhưng điều này sẽ làm phức tạp mọi thứ ... =)
Coops

3
Chúng ta không nên sử dụng trim để đảm bảo mọi thứ diễn ra theo đúng kế hoạch
irfandar

5
@irfandar - Chà, nếu bạn muốn coi một chuỗi có tất cả các khoảng trống là trống, hãy tiếp tục sử dụng trim. Nếu không, một chuỗi với tất cả các không gian không trống.
Martin Ba

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

... 

Trong ví dụ này, nếu listing.OfferTextlà NULL, hàm LEN () cũng sẽ trả về NULL, nhưng đó vẫn không> 0.

Cập nhật

Tôi đã học được một số điều trong 5 năm rưỡi kể từ khi đăng bài này và làm nó khác đi nhiều:

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

Điều này tương tự như câu trả lời được chấp nhận, nhưng nó cũng có một dự phòng trong trường hợp Company.OfferTextcũng là null. Không có câu trả lời hiện tại nào khác sử dụng NULLIF()cũng làm điều này.


Điều này đã được nâng cấp ngày hôm nay, vì vậy nó được lập chỉ mục ở đâu đó. Bây giờ tôi biết một cách tốt hơn để làm điều này hơn câu trả lời ban đầu.
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

Đây là một giải pháp khác:

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

Bạn có thể sử dụng ISNULLvà kiểm tra câu trả lời so với đầu ra đã biết:

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

12

Trong SQL Server 2012 bạn có IIF, ví dụ: bạn có thể sử dụng nó như

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

Giống như cách bạn có thể kiểm tra nếu trường trống.


6

Sử dụng hàm LEN để kiểm tra giá trị null hoặc rỗng. Bạn chỉ có thể sử dụng LEN (@SomeVarcharParm)> 0. Điều này sẽ trả về false nếu giá trị là NULL, '' hoặc ''. Điều này là do LEN (NULL) trả về NULL và NULL> 0 trả về false. Ngoài ra, LEN ('') trả về 0. Xem cho chính bạn chạy:

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

Khi bạn nói "... LEN (NULL) trả về NULL và NULL> 0 trả về sai ...", quy tắc thực sự là mọi bài kiểm tra hoặc comparaison với NULL đều trả về NULL!
Didier68

Đúng là đáng chú ý, nhưng điều này hoạt động như một lối tắt bởi vì sự so sánh làm cho null kết hợp với boolean chính xác, vì vậy điều này sẽ không hoạt động đối với phép so sánh nghịch đảo của LEN (NULL) = 0 khi chúng ta muốn trả về true hoặc null .
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

Thêm một cho câu trả lời đầu tiên (5 năm sau) để sử dụng cả hai NULLIF()và kết hợp thành một chuỗi trống nếu company.OfferTextlà null. Tuy nhiên, NULLIF()cuộc gọi thứ 2 ở đây không phục vụ mục đích nào, vì nếu giá trị đó là một chuỗi trống, bạn sẽ kết hợp lại thành một chuỗi trống.
Joel Coehoorn

4

Sự kết hợp đơn giản này của COALESCE và NULLIF sẽ thực hiện thủ thuật:

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

Lưu ý: Thêm một chuỗi trống khác làm đối số COALESCE cuối cùng nếu bạn muốn câu lệnh trả về một chuỗi trống thay vì NULL nếu cả hai giá trị là NULL.


4

Tôi biết đây là một chủ đề cũ nhưng tôi chỉ thấy một trong những bài viết trước đó ở trên và nó không đúng.

Nếu bạn đang sử dụng LEN (...) để xác định xem trường là NULL hay EMPTY thì bạn cần sử dụng nó như sau:

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

3

Đây là một giải pháp, nhưng tôi không biết liệu nó có tốt nhất không ....

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

cú pháp này:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

làm việc cho tôi trong Microsoft SQL Server 2008 (SP3)


2

Để ngăn các bản ghi có Emptyhoặc Nullgiá trị trong kết quả SQL

chúng ta chỉ cần thêm ..... WHERE Column_name != '' or 'null'


Đây sẽ là cổng cuộc gọi đầu tiên nhưng nếu bạn đang thực hiện những việc như ghép từ nhiều cột trong một bảng chẳng hạn, thì điều này sẽ loại trừ hàng thay vì chỉ hiển thị một khoảng trống cho cột đó
Coops


0

[Cột_name]> '' không bao gồm Nulls và chuỗi rỗng. Có một khoảng trống giữa các dấu ngoặc đơn.


0

Điều này phục vụ cho không gian là tốt.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
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.