Jak sprawdzić, czy na serwerze SQL nie jest pusty i nie jest pusty ciąg?

202

Jak możemy sprawdzić w SQL Server WHEREwarunek, czy kolumna nie ma wartości NULL, a nie pusty ciąg ( '')?

użytkownik993935
źródło

Odpowiedzi:

303

Jeśli chcesz dopasować tylko „” jako pusty ciąg

WHERE DATALENGTH(COLUMN) > 0 

Jeśli chcesz policzyć dowolny ciąg składający się w całości ze spacji jako pusty

WHERE COLUMN <> '' 

Oba nie zwrócą NULLwartości, jeśli zostaną użyte w WHEREklauzuli. Jak NULLoceni, jak UNKNOWNdla nich, a nie TRUE.

CREATE TABLE T 
  ( 
     C VARCHAR(10) 
  ); 

INSERT INTO T 
VALUES      ('A'), 
            (''),
            ('    '), 
            (NULL); 

SELECT * 
FROM   T 
WHERE  C <> ''

Zwraca tylko pojedynczy wiersz A. Tj. Wiersze z NULLlub pusty ciąg lub ciąg składający się całkowicie ze spacji są wykluczone przez to zapytanie.

SQL Fiddle

Martin Smith
źródło
6
Dlaczego nie WHERE COALESCE(column, '') <> ''?
Lieven Keersmaekers,
10
Ponieważ jeśli columnma indeks, to twoje zapytanie prawdopodobnie go nie wykorzysta
Lamak
106
WHERE NULLIF(your_column, '') IS NOT NULL

Teraz (po 4,5 roku), aby ułatwić człowiekowi czytanie, po prostu skorzystam

WHERE your_column <> ''

Podczas gdy istnieje pokusa, aby jawnie sprawdzić zerowanie ...

WHERE your_column <> '' 
      AND your_column IS NOT NULL

... jak pokazuje @Martin Smith w zaakceptowanej odpowiedzi, tak naprawdę nic nie dodaje (a ja osobiście całkowicie unikam null SQL, więc i tak by mnie to nie dotyczyło!).

oneedaywhen
źródło
15

Coalesce złoży wartości zerowe w wartość domyślną:

COALESCE (fieldName, '') <> ''
Anoop Verma
źródło
8

w podstawowy sposób

SELECT *
FROM [TableName]
WHERE column_name!='' AND column_name IS NOT NULL
Saalim Bhoraniya
źródło
7

Sposobem na to w indeksie jest:

where (field is not null and field <> '')

Jeśli nie ma wielu wierszy lub to pole nie jest indeksowane, możesz użyć:

 where isnull(field,'') <> ''
Luc
źródło
2

Możesz użyć jednego z nich, aby sprawdzić wartości puste, białe i puste.

WHERE COLUMN <> '' 

WHERE LEN(COLUMN) > 0

WHERE NULLIF(LTRIM(RTRIM(COLUMN)), '') IS NOT NULL
DxTx
źródło
0

Wystarczy sprawdzić: gdzie wartość> '' - nie jest pusta i pusta

-- COLUMN CONTAINS A VALUE (ie string not null and not empty) :
-- (note: "<>" gives a different result than ">")
select iif(null    > '', 'true', 'false'); -- false (null)
select iif(''      > '', 'true', 'false'); -- false (empty string)
select iif(' '     > '', 'true', 'false'); -- false (space)
select iif('    '  > '', 'true', 'false'); -- false (tab)
select iif('
'                  > '', 'true', 'false'); -- false (newline)
select iif('xxx'   > '', 'true', 'false'); -- true
--
--
-- NOTE - test that tab and newline is processed as expected:
select 'x   x' -- tab
select 'x

x' -- newline
Ellis
źródło