Czy w MySQL mogę wybierać kolumny tylko tam, gdzie coś istnieje?
Na przykład mam następujące zapytanie:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
Próbuję wybrać tylko wiersze, w których telefon zaczyna się od 813, a phone2 ma coś w sobie.
phone2
coś w tym jest?” Ludziephone2
Odpowiedzi:
Porównaj wartość
phone2
z pustym ciągiem:Zauważ, że
NULL
wartość jest interpretowana jakofalse
.źródło
phone2<>""
nie przejdzie przez żaden moduł sprawdzania składni SQL.Aby sprawdzić, czy pole ma wartość NULL
IS NULL
,IS NOT NULL
operatory.Referencje MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
źródło
Sprawdź
NULL
i opróżnij wartości ciągu:NB: Myślę, że COALESCE () jest standardem SQL (-ish), podczas gdy ISNULL () nie.
źródło
Odpowiedź, z której korzystam, która działa dla mnie całkiem dobrze, której jeszcze nie widziałem (to pytanie jest bardzo stare, więc mogło wtedy nie zadziałać) jest w rzeczywistości
Zwróć uwagę na
> ''
część, która sprawdzi, czy wartość nie jest pusta, i czy wartość nie jest tylko białą spacją lub pustą.Zasadniczo, jeśli pole zawiera coś innego niż białe znaki lub
NULL
, to prawda. Jest również bardzo krótki, więc łatwo go pisać, a dodatkowym plusem w stosunku do funkcjiCOALESCE()
iIFNULL()
jest to, że jest przyjazny dla indeksu, ponieważ nie porównujesz wyników funkcji w polu z niczym.Przypadki testowe:
AKTUALIZACJA Istnieje zastrzeżenie, którego się nie spodziewałem, ale wartości liczbowe, które są zerowe lub niższe, nie są większe niż pusty ciąg znaków, więc jeśli masz do czynienia z liczbami, które mogą być zerowe lub ujemne, NIE Rób tego , ugryzł mnie bardzo niedawno i bardzo trudno było go debugować :(
Jeśli używasz ciągów znaków (char, varchar, text itp.), Będzie to w porządku, po prostu bądź ostrożny z liczbami.
źródło
Jeśli w polu phone2 znajdują się spacje przed przypadkowym wprowadzeniem danych, możesz zignorować te rekordy za pomocą funkcji IFNULL i TRIM:
źródło
źródło
NULL
wartością a pustym ciągiem,''
który jest wartością. Jeśli chcesz sprawdzić pusty ciąg, użyjcolumn <> ''
zgodnie z sugestiami innych odpowiedzi.Może wymagać drobnych poprawek w zależności od domyślnej wartości. Jeśli zezwoliłeś na wypełnienie zerowe, możesz zamiast tego zrobić „Nie NULL”, co jest oczywiście lepsze.
źródło
NOT()
MySQL 2phone2=""
nie ma funkcji) nie przejdzie przez żaden moduł sprawdzania składni SQL.Możemy użyć CASE do ustawienia pustej wartości na char lub String. Używam NA jako ciągu domyślnego.
źródło
Inną alternatywą jest przyjrzenie się konkretnie
CHAR_LENGTH
wartościom kolumny. (nie mylić zLENGTH
)Zastosowanie kryteriów, w których długość znaku jest większa od 0, pozwoli uniknąć fałszywych trafień, gdy wartości kolumn mogą być zmienne, na przykład w przypadku kolumny całkowitej o wartości
0
lubNULL
. Zachowanie bardziej spójne dla różnych typów danych.Co powoduje, że każda wartość ma co najmniej 1 znak lub w inny sposób nie jest pusta.
Przykład https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1
Dane tabeli
CHAR_LENGTH(phone2) > 0
Wyniki (takie same)Alternatywy
phone2 <> ''
Wyniki (różne)phone2 > ''
Wyniki (różne)COALESCE(phone2, '') <> ''
Wyniki (takie same)Uwaga: wyniki różnią się od tych,
phone2 IS NOT NULL AND phone2 <> ''
których się nie oczekujephone2 IS NOT NULL AND phone2 <> ''
Wyniki (różne)źródło
Zaskakująco (jak nikt wcześniej o tym nie wspominał) stwierdził, że warunek poniżej spełnia swoje zadanie:
kiedy musimy wykluczyć zarówno wartości puste, jak i zerowe. Czy ktoś jest świadomy wad tego podejścia?
źródło
Posługiwać się:
źródło
IS NOT NULL
nie stosuje się tylko do ciągów kolumn z pustymi wartościami (''
). Nie wiem dlaczego, ale chciałem tylko to podkreślić. Rozsądniej jest go używaćt.phone2 <> ''
podczas sprawdzania pustych kolumn ciągów.w tym celu możesz użyć operatora wieloznacznego:
w ten sposób można uzyskać wszystkie phone2, które mają prefiks numeru.
źródło
W moim przypadku miałem kolumnę varchar, obie metody
IS NOT NULL
&!= ''
nie działały , ale następujące działały dla mnie. Po prostu to tutaj przedstawiam.źródło