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 ...)

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 = '';

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;

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.


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


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

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

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.


5

próbować

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

-> 0, 0, 1

lub

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

Odniesienie


5

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

select * from my_table where ISNULL(NULLIF(some_col, ''));

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 :)


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;

3

Możesz też zrobić

SELECT * FROM table WHERE column_name LIKE ''

Odwrotna istota

SELECT * FROM table WHERE column_name NOT LIKE ''

Najwyraźniej nie działa: select NULL like ''zwraca NULL- przynajmniej w MySQL.
Tytus

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

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


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

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


-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

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Zła odpowiedź. To się nie wybierze NULL.
Pang
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.