Як перевірити, чи є рядок сервера 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
Я не міг вирішити, чи варто підкріплювати вашу відповідь чи дядькофофа, оскільки він, здається, відповів першим, але його відповідь було змінено після того, як ви відповіли. Я закінчив подати обидва.
Зекк

якщо listing.Offer_Text = '', він передає умову NULLIF. Я сумую.
Меррітт

Поки company.Offer_Text не буде нульовим, але тоді це ускладнить справи ... =)
Купи

3
Чи не слід використовувати обробку, щоб переконатися, що все йде за планом
irfandar

5
@irfandar - Ну, якщо ви хочете вважати рядок з усіма пробілами порожнім, вперед використовуйте обрізку. Інакше рядок із усіма пробілами не порожній.
Мартін Ба

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

... 

У цьому прикладі, якщо listing.OfferTextNULL, функція 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 повертає false. Також 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 повертає false ...", справжнє правило полягає в тому, що кожен тест або порівняння з NULL повертають NULL!
Didier68

Право, що варто зазначити, але це працює як ярлик, тому що порівняння робить нульове з’єднання з правильним булевим, тому це не буде працювати для зворотного порівняння LEN (NULL) = 0, коли ми хочемо повернути true для null або порожній .
Зак Джонсон

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()виклик тут не виконує жодної мети, так, як якщо б це значення порожнього рядка, який ви просто все одно збираєтеся в порожній рядок
Joel Coehoorn

4

Це просте поєднання COALESCE та NULLIF повинно зробити трюк:

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

Примітка. Додайте ще один порожній рядок як останній аргумент COALESCE, якщо ви хочете, щоб оператор повертав порожню рядок замість NULL, якщо обидва значення NULL.


4

Я знаю, що це стара тема, але я щойно побачив одну з попередніх публікацій вище, і це не правильно.

Якщо ви використовуєте LEN (...), щоб визначити, чи є поле NULL або EMPTY, вам потрібно використовувати його наступним чином:

...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

[Ім'я стовпця]> '' виключає нулі та порожні рядки. Між цитатами є пробіл.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.