Как проверить, является ли строка сервера Sql нулевой или пустой - PullRequest
206 голосов
/ 02 декабря 2008

Я хочу проверить данные, но игнорировать их, если они нулевые или пустые. В настоящее время запрос выглядит следующим образом ...

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, если перечисление .Offertext - это пустая строка, а также если она пуста.

Какое решение наиболее эффективно?

Ответы [ 15 ]

391 голосов
/ 13 июля 2010

Я думаю, что это:

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;
48 голосов
/ 02 декабря 2008
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 с половиной лет с момента публикации, и теперь делаю это по-другому:

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

Это похоже на принятый ответ, но оно также имеет запасной вариант в случае, если Company.OfferText также является нулевым. Ни один из других текущих ответов, использующих NULLIF(), также не делает этого.

33 голосов
/ 02 декабря 2008
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
16 голосов
/ 24 марта 2009

Вот еще одно решение:

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
11 голосов
/ 02 декабря 2008

Вы можете использовать ISNULL и сравнить ответ с известным выводом:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST
10 голосов
/ 01 августа 2014

В SQL Server 2012 у вас есть IIF, например, вы можете использовать его как

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

Точно так же вы можете проверить, не заполнено ли поле.

4 голосов
/ 14 сентября 2015

Используйте функцию LEN, чтобы проверить наличие нулевых или пустых значений. Вы можете просто использовать LEN (@SomeVarcharParm)> 0. Это вернет false, если значение равно 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
3 голосов
/ 27 января 2016

Эта простая комбинация COALESCE и NULLIF должна помочь:

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

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

3 голосов
/ 10 сентября 2013
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
2 голосов
/ 28 августа 2017

Я знаю, что это старая тема, но я только что видел один из предыдущих постов выше, и это не правильно.

Если вы используете LEN (...) , чтобы определить, является ли поле NULL или ПУСТОЙ , вам необходимо использовать его следующим образом:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...