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.