Jak sprawdzić, czy kolumna jest pusta lub pusta w MySQL?

288

Mam kolumnę w tabeli, która może zawierać wartości puste lub puste. Jak sprawdzić, czy kolumna jest pusta lub pusta w wierszach obecnych w tabeli?

(e.g. null or '' or '  ' or '      ' and ...)
priya
źródło
1
Kod MySQL: select isnull(mycolumn) from mytablezwraca 1, jeśli moja kolumna ma wartość NULL.
Eric Leschinski,
2
co z długością (przycięcie (moja kolumna))> 0?
Cyril Jacquart
Dla MSSQL> GDZIE KOLUMNA <> '' LUB GDZIE DŁUGOŚĆ (KOLUMNA)> 0 LUB GDZIE NULLIF (LTRIM (RTRIM (KOLUMNA)), '') NIE JEST NULL
DxTx

Odpowiedzi:

445

Spowoduje to zaznaczenie wszystkich wierszy, w których some_coljest NULLlub ''(pusty ciąg)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
maček
źródło
7
Jeśli zmienisz warunek na WHERE some_col IS NULL OR some_col = ' '(jedna spacja wstawiona w łańcuch), to będzie on działał zarówno na MySQL, jak i Oracle, zobacz odpowiedź „onedaywhen”. some_col = ''nie działa na Oracle, ponieważ puste ciągi oznaczają NULL.
Johanna
1
@Johanna, ale jeśli przejdziesz na ' ', to nie będzie działać w SQLite. Obsługuje tylko identyczne / bezpośrednie dopasowanie ciągów.
Magne
131

Jak zdefiniowano w standardzie SQL-92, przy porównywaniu dwóch ciągów o różnych szerokościach węższa wartość jest uzupełniana spacjami w prawo, aby uzyskać taką samą szerokość jak szersza wartość. Dlatego wszystkie wartości ciągów, które składają się całkowicie ze spacji (w tym spacji zerowych) będą uważane za równe np

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Dlatego powinno to działać niezależnie od tego, ile spacji stanowi some_colwartość:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

lub bardziej zwięźle:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
oneedaywhen
źródło
6
Dzięki za wzmiankę o wyściełanych miejscach. Możesz z nich skorzystać i zmienić warunek na WHERE some_col IS NULL OR some_col = ' '(jedno miejsce wstawione w łańcuch), a następnie działa zarówno na MySQL, jak i Oracle. some_col = ''nie działa na Oracle, ponieważ puste ciągi oznaczają NULL, a pełny warunek staje się NULL.
Johanna
Moim wymaganiem było znaleźć SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; i SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;pracować dla mnie w MySQL. Mam nadzieję, że to się przyda.
Dinuka Dayarathna
Właściwie '' = ' 'działa w SQLServer, ale nie w SQLite, o ile wiem, od przetestowania go teraz.
Magne
66

Krótszy sposób napisania warunku:

WHERE some_col > ''

Ponieważ null > ''produkuje unknown, powoduje to odfiltrowanie zarówno nullciągów pustych , jak i pustych.

Andomar
źródło
2
Czy istnieje sposób, aby uzyskać odwrotność tego, uzyskać wszystkie rekordy, gdzie jest NULL lub pusty ciąg?
Joshua Pinter,
14
@JoshPinter:coalesce(some_col, '') = ''
Andomar
6
Być może kiedyś tak było, ale nie działa w MySQL 14.14.
Gunnar Þór Magnússon
działa świetnie i jest to jedyny sposób, w jaki mógłbym wymyślić, jak odfiltrować zarówno puste, jak i puste pola w MariaDB
Neal Davis,
1
Używam some_col <> '', aby znaleźć odwrotność tego
Chargnn,
18

Możesz sprawdzić, czy kolumna jest pusta, czy nie jest pusta, używając WHERE col IS NULLlub WHERE col IS NOT NULLnp

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

W twoim przykładzie masz różne kombinacje białej przestrzeni. Możesz usunąć białe znaki TRIMi użyć COALESCEdomyślnej wartości NULL (COALESCE zwróci pierwszą wartość inną niż null z podanych wartości.

na przykład

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

To ostatnie zapytanie zwróci wiersze, w których MyColjest pusta lub ma dowolną długość białych znaków.

Jeśli możesz tego uniknąć, lepiej nie mieć funkcji w kolumnie w klauzuli WHERE, ponieważ utrudnia to użycie indeksu. Jeśli chcesz po prostu sprawdzić, czy kolumna jest pusta lub pusta, lepiej jest zrobić to:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Zobacz TRIM COALESCE i IS NULL, aby uzyskać więcej informacji.

Także praca z wartościami null z dokumentów MySQL

Code Magician
źródło
2
Przedstawiasz prawdziwe rozwiązanie w bardzo skomplikowany sposób. Najpierw przedstawisz niepełne rozwiązanie jego problemu „gdzie mycol jest zerowy”. Następnie przedstawiamy rozwiązanie wykorzystujące dwie funkcje zagnieżdżone w klauzuli where, nawet mówiąc, że należy tego unikać. Dopiero wtedy dochodzisz do prawdziwego rozwiązania. W przyszłości najpierw przedstaw swoje prawdziwe rozwiązanie.
Brak drugiego znaku )przed =znakiem w drugim przykładzie
Rorrim
15

Inna metoda bez GDZIE, spróbuj tego ...

Wybierze wartości puste i zerowe

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
PodTech.io
źródło
zwraca 1, jeśli jest coś zerowego, dlaczego tak jest?
noobie-php
NULLIF sprawdza nazwę pola pod kątem pustej wartości i przekształciłby się w NULL, gdyby była pusta. ISNULL zwraca 1 (prawda), jeśli NULLIF pomyślnie zmieniło puste pole na NULL lub jeśli było już NULL .... spróbuj samodzielnie na pustym i pustym polu w tabeli z dwiema oddzielnymi funkcjami wybierz isnull (X) , wybierz nullif (y)
PodTech.io
9

Zarówno

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

lub

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Reynante Daitol
źródło
6

Nienawidzę niechlujnych pól w moich bazach danych. Jeśli kolumna może być pustym ciągiem lub ma wartość NULL, wolę to naprawić przed dokonaniem wyboru za każdym razem, tak jak poniżej:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Dzięki temu dane są uporządkowane, o ile z jakiegoś powodu nie musisz specjalnie odróżniać wartości NULL od pustych.

Keith Johnson
źródło
5

próbować

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

lub

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Odniesienie

diEcho
źródło
5

To stwierdzenie jest dla mnie o wiele czystsze i bardziej czytelne:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Amaynut
źródło
4

Podczas sprawdzania null or Emptywartości kolumny w moim projekcie zauważyłem, że istnieją pewne obawy dotyczące wsparcia w różnych bazach danych.

Każda baza danych nie obsługuje TRIM metoda.

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

Funkcja TRIM w SQL służy do usuwania określonego prefiksu lub sufiksu z łańcucha. Najczęściej usuwanym wzorem są białe spacje. Ta funkcja jest wywoływana inaczej w różnych bazach danych:

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

Jak sprawdzić puste / puste: -

Poniżej znajdują się dwa różne sposoby według różnych baz danych

Składnia tych funkcji przycinania jest następująca:

  1. Użycie Trim do sprawdzenia

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Korzystanie z LTRIM i RTRIM do sprawdzania-

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

Powyższe dwa sposoby zapewniają ten sam wynik, wystarczy użyć w oparciu o wsparcie DataBase. To po prostu zwraca FirstNameod UserDetailsstołu, jeśli ma pustyLastName

Mam nadzieję, że to ci pomoże :)

Vikash Pandey
źródło
3

Jeśli chcesz, aby wartości NULL były prezentowane jako ostatnie podczas wykonywania ORDER BY, spróbuj tego:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
Człowiek widmo
źródło
3

Możesz też zrobić

SELECT * FROM table WHERE column_name LIKE ''

Odwrotna istota

SELECT * FROM table WHERE column_name NOT LIKE ''
brenjt
źródło
Najwyraźniej nie działa: select NULL like ''zwraca NULL- przynajmniej w MySQL.
Tytus
2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Baltazar Moreno
źródło
Miałem problem z polem, które czasami było zerowe. Pomogło to:col1 != IFNULL(col2,'')
webaholik,
1

Sprawdź, czy nie ma wartości null

$column is null
isnull($column)

Sprawdź, czy jest pusty

$column != ""

Jednak zawsze należy ustawić NOT NULL dla kolumny,
optymalizacja mysql może obsłużyć tylko jeden poziom IS NULL

ajreal
źródło
3
Nigdy nie przyjmować NULLwartości to kolejny cały temat do dyskusji. Nie wydaje mi się właściwe, aby przedstawiać to zalecenie bez podania uzasadnienia.
maekek,
Dołączyłem, bądź cierpliwy. Plus naprawdę utrudnia życie przy użyciu NULL (tak jak to pytanie).
ajreal,
5
To okropna rekomendacja. Ustawienie NOT NULL w kolumnie, której wartość może nie być znana w momencie INSERT, służy jedynie zachęceniu do korzystania z niestandardowych wartości „null”, takich jak -1i ''.
Dan Bechard
@ Dan, jeśli nie jesteś pewien, jaka jest wartość podczas wstawiania, możesz mieć trudności z przeprowadzeniem jakiejkolwiek optymalizacji
ajreal
0
select * from table where length(RTRIM(LTRIM(column_name))) > 0
Hakan Ilgar
źródło
1
Jaki jest sens w użyciu zarówno RTRIMa LTRIM, ale nie TRIM?
Nico Haase,
0

W moim przypadku podczas importowania danych do kolumny wprowadzono spację i chociaż wyglądała ona jak pusta kolumna, jej długość wynosiła 1. Najpierw sprawdziłem długość pustej kolumny za pomocą, length(column)a następnie na podstawie tego możemy napisać zapytanie

WYBIERZ * Z TABELI GDZIE DŁUGOŚĆ (KOLUMNA) = długość kolumny dla pustej kolumny

PAN I
źródło
-1

spróbuj tego, jeśli typem danych jest łańcuch, a wiersz ma wartość NULL

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

jeśli typ danych to int lub kolumna ma wartość 0, spróbuj tego

SELECT * FROM table WHERE column_name > = 0
Monis Qureshi
źródło
-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
SaAy
źródło
1
Zła odpowiedź. To się nie wybierze NULL.
Pang