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

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

digiguru
источник

Ответы:

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
Я не мог решить, должен ли я поддержать ваш ответ или ответ дядюшки, так как он, кажется, ответил первым, но его ответ был отредактирован после того, как вы ответили. Я закончил голосование против обоих.
Zecc
если перечисление .Offer_Text = '', оно проходит условие NULLIF. Я расстроен.
Меррит
Пока company.Offer_Text не равно нулю, но это может усложнить ситуацию ... =)
Coops
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 с половиной лет с момента публикации, и теперь делаю это по-другому:

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

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

Джоэл Коухорн
источник
Сегодня за это проголосовали, так что это где-то проиндексировано. Теперь я знаю лучший способ сделать это, чем оригинальный ответ.
Джоэл Коухорн
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
Anax
источник
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

Таким же образом вы можете проверить, является ли поле пустым.

lkurylo
источник
6

Используйте функцию 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
Зак Джонсон
источник
Когда вы говорите «... LEN (NULL) возвращает NULL, а NULL> 0 возвращает false ...», истинное правило заключается в том, что каждый тест или сравнение с NULL возвращает NULL!
Didier68
Правильно, что стоит отметить, но это работает как ярлык, потому что сравнение делает NULL слияния с правильным логическим значением, так что это не будет работать для обратного сравнения 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()вызов здесь не имеет смысла, как если бы это значение было пустой строкой, которую вы все равно собираетесь объединить обратно в пустую строку.
Джоэл Коухорн
4

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

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

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

contactmatt
источник
4

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

Если вы используете LEN (...), чтобы определить, является ли поле пустым или пустым, вам нужно использовать его следующим образом:

...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
digiguru
источник
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
Anoop Verma
источник
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
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
user3829854
источник
0

[Column_name]> '' исключает Null и пустые строки. Между одинарными кавычками есть пробел.

Хишам
источник
0

Это обслуживает пространства также.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
рамит гирдхар
источник