Jak sprawdzić wartości null / puste / białe znaki za pomocą jednego testu?

88

Chciałbym napisać instrukcję SELECT, która używa tylko jednego testu do zwracania kolumn bez wartości (null, puste lub wszystkie spacje).

Myślałem, że to zadziała:

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

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

Oczywiście, że mogę dodać

OR column_name IS NULL

i będzie działać, ale chciałbym mieć sposób, w którym wykorzystuje się pojedynczy test.

John Gordon
źródło
1
Związane z: stackoverflow.com/questions/4042496/ ...
Kucyki OMG
Czy nie jest pożądane wykonywanie wielu testów? tj. większa szczegółowość = lepsza informacja zwrotna dla użytkowników na temat poprawiania danych.
kiedy
@onedaywhen: Ogólnie lepiej byłoby mieć większą szczegółowość, ale pracuję z istniejącą bazą kodu i chcę jak najdokładniej naśladować istniejącą strukturę kodu. Obecny kod wykonuje tylko jeden test, więc szukałem rozwiązania, które również miało tylko jeden test.
John Gordon

Odpowiedzi:

99

Funkcjonalnie powinieneś móc używać

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Problem polega na tym, że indeks w kolumnie COLUMN_NAME nie zostałby użyty. Jeśli jest to warunek selektywny, musisz mieć indeks oparty na funkcjach na TRIM (nazwa_kolumny).

Justin Cave
źródło
32
Uwaga dla użytkowników T-SQL: nie ma TRIM, będziesz potrzebować LTRIM lub RTRIM.
demoncodemonkey
11
Od SQL Server 2017 dostępna jest funkcja TRIM. Źródło
bvwidt
1
@ EhMann365 to pytanie dotyczy Oracle, a nie Sql Server.
MH
11
RTRIM (LTRIM (nazwa_kolumny)) - dla użytkowników Microsft SQL.
DxTx
4
W Sql Server TRIM (nazwa_kolumny) zwraca pusty ciąg „”, a nie NULL. Inne odpowiedzi obsługują zarówno pusty ciąg, jak i NULL
Michael Freidgeim
25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') zwróci „”, jeśli nazwa_kolumny ma wartość NULL, w przeciwnym razie zwróci nazwę_kolumny.

AKTUALIZACJA

W Oracle możesz użyć, NVLaby osiągnąć te same wyniki.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''
GendoIkari
źródło
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 lubić” ”, ponieważ porównuje się ją z wartością zerową
Harrison
Czy nie chciałbym LIKE „” zamiast „NOT LIKE”?
John Gordon
Tak, przepraszam, błędnie odczytałem pierwotne pytanie jako pragnienie wszystkiego, co ma wartość. Ale jak wskazałem, nie wygląda na to, żeby to zadziałało w Oracle.
GendoIkari
Ponieważ używam Oracle, wygląda na to, że mogę użyć WHERE TRIM (col) IS NULL, a to zajmie się wartościami null, pustymi i białymi znakami.
John Gordon
Oczywiście w pierwszej części brakuje nawiasów, powinno to być:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan
14

Funkcja NULLIF przekształci dowolną wartość kolumny zawierającą tylko białe znaki na wartość NULL. Działa z T-SQL i SQL Server 2008 i nowszymi wersjami.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
MerrickPlainview
źródło
1
Dobra odpowiedź zawierałaby wyjaśnienie kodu i dlaczego został napisany w ten sposób. Zalecam zaktualizowanie odpowiedzi :-)
Qirel
1
Jaki to ma sens? Bardziej wydajne byłoby ustawienie go na [nazwa_kolumny] LIKE ''
CICHY
Potrzebuje TRIM do obsługi wielu białych spacji
Michael Freidgeim
1
Testowanie na SQL Server 2017 działa w przypadku wielu białych znaków bez TRIM. Nie ma to dla mnie sensu, ponieważ zgodnie z dokumentacją NULLIF powinien zwracać NULL tylko wtedy, gdy dwa wyrażenia są równe, a ciąg spacji zwykle nie jest pusty. (Testowałem tylko pod kątem spacji, a nie tabulatorów, nowych linii ani innych białych znaków.)
Jovie,
1
@Jovie SQL Server czasami ignoruje końcowe spacje, przeczytaj: stackoverflow.com/questions/17876478/ ...
Brian MacKay
7

Podczas sprawdzania null or Emptywartości dla kolumny zauważyłem, że istnieją pewne problemy z obsługą w różnych bazach danych.

Żadna baza danych nie obsługuje TRIM metoda.

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

Funkcja TRIM w języku SQL służy do usuwania określonego przedrostka lub sufiksu z łańcucha. Najczęściej usuwanym wzorcem są spacje. Ta funkcja jest różnie nazywana w różnych bazach danych:

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

Jak sprawdzić puste / puste / białe znaki: -

Poniżej znajdują się dwa różne sposoby w zależności od różnych baz danych:

Składnia tych funkcji przycinania to:

  1. Używanie Trim do sprawdzania

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Korzystanie z LTRIM i RTRIM do sprawdzenia-

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

Powyższe oba sposoby zapewniają ten sam wynik, po prostu użyj w oparciu o obsługę bazy danych. Zwraca tylko FirstNamefrom UserDetailstable, jeśli ma pustyLastName

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

Vikash Pandey
źródło
Z t as (select '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; nie zwrócił 3 rekordów na serwerze SQL
Waqar
5
Dlaczego potrzebne byłyby zarówno L, jak i RTRIM? Czy tylko jedna z funkcji nie wystarczyłaby do sprawdzenia, czy kolumna jest pusta?
CICHY
4

To zapytanie phpMyAdmina zwraca te wiersze, które NIE są zerowe, puste lub tylko białe spacje:

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 spacje, po prostu usuń NOT.

Wybierz
źródło
2

Użyj poniższego zapytania i działa

SELECT column_name FROM table_name where isnull(column_name,'') <> ''
dvenkateshreddy
źródło
0

To, czego używam IsNotNullOrEmptyOrWhiteSpacew T-SQL, to:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0
TiltonJH
źródło
0

Każda sugestia osoby, aby uruchomić zapytanie w Oracle w celu znalezienia rekordów, których określone pole jest po prostu puste (nie obejmuje (null) ani żadnego innego pola, po prostu pustej linii) nie działała. Wypróbowałem każdy sugerowany kod. Chyba będę szukał w Internecie.

*****AKTUALIZACJA*****

Próbowałem tego i zadziałało, nie jestem pewien, dlaczego to nie zadziała, jeśli <1, ale z jakiegoś powodu <2 zadziałało i zwróciło tylko rekordy, których pole jest po prostu puste

wybierz [nazwa_kolumny] z [nazwa_tabeli], gdzie DŁUGOŚĆ (nazwa_kolumny) <2;

Zgaduję, że jakikolwiek skrypt, który został użyty do konwersji danych, zostawił coś w polu, mimo że pokazuje puste, to jest moje zgadywanie, dlaczego <2 działa, ale nie <1

Jeśli jednak masz inne wartości w tym polu kolumny, które są mniejsze niż dwa znaki, być może będziesz musiał wymyślić inne rozwiązanie. Jeśli nie ma wielu innych postaci, możesz je wyróżnić.

Mam nadzieję, że moje rozwiązanie pomoże kiedyś komuś innemu.

Catwoman
źródło
-3

Podobnie jak w Oracle możesz użyć funkcji NVL w MySQL, możesz użyć IFNULL (columnaName, newValue) aby osiągnąć pożądany rezultat jak w tym przykładzie

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
Marina Planells
źródło
-4

możesz użyć

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
gong15A
źródło