2010-11-05 13 views
41

Chciałbym napisać instrukcję SELECT, która używa tylko jednego testu, aby zwrócić kolumny bez wartości (puste, puste lub wszystkie spacje).Jak sprawdzić wartości puste/puste/białe za pomocą pojedynczego testu?

myślałem, że to będzie działać:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%'; 

Ale to nie działa dla wartości NULL.

Oczywiście mogę dodać

OR column_name IS NULL 

i to będzie działać, ale chciałbym sposób, który wykorzystuje jeden test.

+0

Używam Oracle 10g. –

+1

Powiązane: http://stackoverflow.com/questions/4042496/how-should-i-deature-with-null-parameters-in-a-pl-sql-stored-procedure-when-i-antant-t/4042572 # 4042572 –

+0

Czy nie jest pożądane posiadanie wielu testów? tj. większa ziarnistość = lepsza informacja zwrotna dla użytkowników o tym, jak poprawić dane. – onedaywhen

Odpowiedz

54

Funkcjonalnie, powinieneś być w stanie korzystać z

SELECT column_name 
    FROM table_name 
WHERE TRIM(column_name) IS NULL 

Problem istnieje, że indeks na COLUMN_NAME nie byłyby wykorzystywane. W TRIM (column_name) wymagany jest indeks funkcyjny, jeśli jest to warunek selektywny.

+17

Uwaga dla użytkowników T-SQL: nie ma TRIM, potrzebujesz LTRIM lub RTRIM. – demoncodemonkey

+2

Od ** SQL Server 2017 ** istnieje funkcja TRIM. [Źródło] (https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql) – EhMann365

+0

@ EhMann365 to pytanie dotyczy Oracle, a nie Sql Server. –

11
SELECT column_name from table_name 
WHERE RTRIM(ISNULL(column_name, '')) LIKE '' 

ISNULL(column_name, '') powróci '' jeśli column_name jest NULL, w przeciwnym razie nastąpi powrót nazwa_kolumny.

UPDATE

W Oracle, można użyć NVL aby osiągnąć takie same wyniki.

SELECT column_name from table_name 
WHERE RTRIM(NVL(column_name, '')) LIKE '' 
+3

w rzeczywistości to nadal nie działa w Oracle, Oracle traktuje puste ciągi jako NULL, więc możesz nie mieć klauzuli "nie jak" ", ponieważ porównuje się z wartością zerową – Harrison

+0

Nie chciałbym LIKE" zamiast NIE LUBIĆ '' ? –

+0

Tak, przepraszam, błędne odczytanie pierwotnego pytania jako wymagającego wszystkiego, co ma wartość. Ale jak wskazano, nie wygląda na to, że będzie działać w Oracle. – GendoIkari

-1

As w Oracle można użyć funkcji NVL w MySQL można użyć IFNULL (columnaName, nowaWartość), aby osiągnąć pożądany rezultat, jak w tym przykładzie

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%'; 
-1

Co mogę używać do IsNotNullOrEmptyOrWhiteSpace w T-SQL:

SELECT [column_name] FROM [table_name] 
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0 
-2

można użyć

SELECT [column_name] 
FROM [table_name] 
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL 
0

funkcja NULLIF zamieni każdą kolumnę wartości tylko z białymi znakami do wartości NULL. Działa dla T-SQL i SQL Server 2008 & do góry.

SELECT [column_name] 
FROM [table_name] 
WHERE NULLIF([column_name], '') IS NULL 
+1

Dobra odpowiedź zawierałaby wyjaśnienie kodu i dlaczego została napisana w ten sposób. Polecam aktualizować swoją odpowiedź :-) – Qirel

+0

Zaktualizowano odpowiedź – MerrickPlainview

+0

Co to jest za cel? Bardziej wydajnym byłoby po prostu ustawić go na [nazwa kolumny] LIKE '' – SILENT

3

Podczas sprawdzania null or Empty wartość dla kolumny, zauważyłem, że istnieją pewne obawy wsparcia w różnych bazach danych.

Każdy Database nie obsługuje TRIM metody.

Poniżej przedstawiono macierz, aby zrozumieć obsługiwane metody przez różne bazy danych.

Funkcja TRIM w języku SQL służy do usuwania określonego prefiksu lub sufiksu z ciągu znaków. Najczęściej usuwanym wzorcem są białe przestrzenie.Funkcja ta nazywa się różnie w różnych bazach danych:

  • MySQL:TRIM(), RTRIM(), LTRIM()
  • Oracle:RTRIM(), LTRIM()
  • SQL Server:TRIM(), RTRIM(), LTRIM()

Jak sprawdzić Empty/Null/Whitespace: -

Poniżej są dwa różne sposoby w zależności od różnych Databases-

składnia tych funkcji są wykończenia:

  1. Zastosowanie TRIM odbojnice

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Zastosowanie LTRIM & RTRIM do odpraw

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Przede oba sposoby zapewnienia sam wynik wystarczy użyć w oparciu o wsparcie dla baz danych. To po prostu zwraca FirstNameUserDetails od stołu, jeśli ma pustą LastName

nadzieję, że to pomoże innym też :)

+0

Z t as (wybierz "c unii all select" c unii all wybierz NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) JEST NULL ; nie zwrócił 3 rekordy na serwerze SQL – Waqar

+1

Dlaczego potrzebny byłby L & RTRIM? Czy nie wystarczy jedna z funkcji, aby sprawdzić, czy kolumna jest pusta? – SILENT

0

To zapytanie phpMyAdmin wraca te wiersze, to nie są puste lub pusty lub tylko białe znaki :

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE '')) 

Jeśli chcesz wybrać wiersze, które są puste/puste/tylko białe znaki, po prostu usuń NOT.