Jaki jest najlepszy sposób sprawdzenia, czy wartość jest pustym ciągiem w instrukcjach sql Postgres?
Wartość może być wyrażeniem długim, dlatego zaleca się, aby była zapisywana tylko raz w szachu.
Obecnie używam:
coalesce( trim(stringexpression),'')=''
Ale wygląda trochę brzydko.
stringexpression
może być char(n)
kolumną lub wyrażeniem zawierającym char(n)
kolumny ze spacjami na końcu.
Jaki jest najlepszy sposób?
char
jest prawie zawsze złym wyborem ze względu na wypełnienie (i wynikające z tego marnotrawstwo miejsca). Ale poza tym: nie sądzę, aby było lepsze rozwiązanie.Odpowiedzi:
Wyrażenie
stringexpression = ''
daje:TRUE
.. for''
(lub dla dowolnego łańcucha składającego się tylko ze spacji z typem danychchar(n)
)NULL
.. forNULL
FALSE
.. dla czegokolwiek innegoAby więc sprawdzić: „
stringexpression
jest NULL lub pusty” :Lub odwrotne podejście (może być łatwiejsze do odczytania):
Działa dla każdego typu postaci, w tym
char(n)
. Podręcznik o operatorach porównania.Lub użyj oryginalnego wyrażenia bez
trim()
, co jest kosztownym szumemchar(n)
(patrz poniżej), lub niepoprawne dla innych typów znaków: łańcuchy zawierające tylko spacje byłyby traktowane jako pusty łańcuch.Ale wyrażenia na górze są szybsze.
Stwierdzenie czegoś przeciwnego jest jeszcze prostsze: „
stringexpression
nie ma wartości NULL ani pustej” :O
char(n)
Jest to o rodzaju danych
char(n)
, skrót:character(n)
. (char
/character
są skrótem odchar(1)
/character(1)
.) Jego użycie jest odradzane w Postgres :Nie należy mylić
char(n)
z rodzaju inne, przydatne, charaktervarchar(n)
,varchar
,text
lub"char"
(z podwójnych cudzysłowów).W
char(n)
na pusty ciąg nie różni się od jakiegokolwiek innego napisu, składające się tylko z przestrzeni. Wszystkie te elementy są składane do n spacjichar(n)
zgodnie z definicją typu. Wynika z tego logicznie, że powyższe wyrażenia działająchar(n)
również - tak samo jak te (które nie działałyby dla innych typów znaków):Próbny
Pusty ciąg równa się dowolnemu ciągowi spacji, gdy jest rzutowany na
char(n)
:Wynik:
Sprawdź „pusty lub pusty ciąg” za pomocą
char(n)
:Wynik:
Sprawdź „pusty lub pusty ciąg” za pomocą
text
:Wynik:
db <> skrzypce tutaj
Stare sqlfiddle
Związane z:
źródło
best way to check if value is null or empty string
.trim()
Połączenie jest (stosunkowo) kosztowny - i po prostu nie jest to konieczne. Dodałem więcej informacjichar(n)
i „pusty ciąg”.''
. Czy mogę zdjąć wykończenie i użyćcoalesce(stringexpression,'')=''
do sprawdzenia. Wydaje mi się to bardziej czytelne w porównaniu z twoją odpowiedzią.select coalesce(' ', '') = ''
zwraca false. Tak więc TRIM () jest wymaganecoalesce(' '::char(5), '') = ''
tak nie jest. W każdym razie użyłbym jednego z dwóch górnych wyrażeń, które działają dla dowolnego typu znaków, są najszybsze i najczystsze.Aby sprawdzić, czy są puste i puste:
Aby sprawdzić null, puste i spacje (przyciąć ciąg)
źródło
Sprawdzanie długości sznurka również działa i jest zwarte:
źródło
where length(stringexpression) = 0;
. To działa dla mnie.Jeśli na końcu mogą znajdować się puste spacje, prawdopodobnie nie ma lepszego rozwiązania.
COALESCE
jest tylko dla problemów takich jak twój.źródło
Coś, czego używają ludzie, to
stringexpression > ''
. Może nie jest to najszybszy, ale tak się składa, że jest jednym z najkrótszych.Wypróbowałem to na MS SQL, a także na PostgreSQL.
źródło
w inny sposób
źródło
Preferowany przeze mnie sposób porównywania pól dopuszczających wartość null to: NULLIF (nullablefield,: ParameterValue) IS NULL AND NULLIF (: ParameterValue, nullablefield) IS NULL. Jest to kłopotliwe, ale ma uniwersalne zastosowanie, podczas gdy Coalesce w niektórych przypadkach jest niemożliwe.
Drugie i odwrotne użycie wartości NULLIF wynika z tego, że „NULLIF (nullablefield,: ParameterValue) IS NULL” zawsze zwróci wartość „true”, jeśli pierwszy parametr ma wartość null.
źródło
Jeśli baza danych ma dużą liczbę rekordów,
null check
może to zająć więcej czasu, możesz użyć sprawdzania wartości null na różne sposoby, na przykład: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
źródło
Wiele odpowiedzi to najkrótsza droga, niekoniecznie najlepsza, jeśli kolumna zawiera wiele wartości zerowych. Przerwanie sprawdzeń pozwala optymalizatorowi na szybszą ocenę testu, ponieważ nie musi on wykonywać pracy nad innym warunkiem.
Porównanie ciągów nie musi być oceniane, ponieważ pierwszy warunek jest fałszywy.
źródło