Przykład kodu SQL usuwający zbędne zera z wartości numerycznych przechowywanych jako tekst w kolumnie „COL1”
COL1 | NEW_COL1 |
---|---|
13.00 | 13 |
12.300 | 12.3 |
12 | 12 |
12.0 | 12 |
12.345 | 12.345 |
12.50 | 12.5 |
12.550 | 12.55 |
SELECT
CASE
WHEN "table1"."COL1" :: TEXT ~~ '%.%' :: TEXT THEN
TRIM(TRAILING '.' :: TEXT FROM TRIM(TRAILING '0' :: TEXT FROM "TABLE1"."COL1")) :: CHARACTER VARYING ELSE "TABLE1"."COL1"
END AS "NEW_COL1"
FROM
"TABLE1"
SQLSELECT ... FROM "TABLE1"
: To polecenie wybiera dane z tabeli o nazwie „TABLE1”.CASE WHEN ... THEN ... ELSE ... END AS "NEW_COL1"
: To jest instrukcja warunkowaCASE
. Pozwala ona na wykonanie różnych operacji w zależności od spełnienia określonego warunku.AS "NEW_COL1"
nadaje nowej kolumnie nazwę „NEW_COL1”. Oznacza to, że zapytanie utworzy nową kolumnę z wyczyszczonymi danymi, pozostawiając oryginalną kolumnę „COL1” bez zmian."table1"."COL1"::TEXT ~~ '%.%'::TEXT
: To jest warunek, który jest sprawdzany przez instrukcjęCASE
."table1"."COL1"::TEXT
: Ta część jest bardzo ważna. Konwertuje dane z kolumny „COL1” na typ danychTEXT
(tekstowy). Operator~~
(który działa podobnie doLIKE
, ale jest czuły na wielkość liter) działa na ciągach tekstowych. Nawet jeśli kolumna „COL1” przechowuje liczby, ta część traktuje je jako tekst na potrzeby porównania.~~ '%.%'::TEXT
: To jest operacja dopasowywania wzorca.'%.%'
to wzorzec przypominający wyrażenie regularne. Oznacza „dowolne znaki (%
), po których następuje dosłowny znak kropki (.
), a po nim dowolne znaki (%
)”. Zatem ten warunek sprawdza, czy wartość w „COL1” zawiera kropkę. W ten sposób kod identyfikuje wartości, które wyglądają jak liczby dziesiętne.
TRIM(TRAILING '.'::TEXT FROM TRIM(TRAILING '0'::TEXT FROM "TABLE1"."COL1"))::CHARACTER VARYING
: Ta część jest wykonywana tylko, jeśli warunek (obecność kropki) jest prawdziwy. To jest część odpowiedzialna za czyszczenie danych:TRIM(TRAILING '0'::TEXT FROM "TABLE1"."COL1")
: To polecenie usuwa zera z prawej strony ciągu tekstowego. Na przykład, jeśli „COL1” ma wartość „12.300”, ta część da w wyniku „12.3”.TRIM(TRAILING '.'::TEXT FROM ...)
: To polecenie usuwa kropkę z prawej strony ciągu tekstowego. Na przykład, jeśli „COL1” ma wartość „12.3.”, ta część da w wyniku „12.3”.- Połączenie tych dwóch operacji
TRIM
usuwa zarówno zera z końca, jak i kropkę z końca, jeśli występują. Zatem „12.300.” zmieni się w „12.3”. ::CHARACTER VARYING
: To polecenie konwertuje wynik z powrotem na typ danychCHARACTER VARYING
(ciąg tekstowy o zmiennej długości). Jest to ważne, aby „NEW_COL1” miała ten sam typ danych, co oryginalna kolumna „COL1” (lub typ z nią zgodny).
"TABLE1"."COL1"
: Ta część jest wykonywana tylko, jeśli warunek (obecność kropki) jest fałszywy. Jeśli wartość w „COL1” nie zawiera kropki, jest używana bezpośrednio w kolumnie „NEW_COL1” bez żadnych zmian.
Miałem podobny problem z usuwaniem zer z wartości numerycznych i ten kod okazał się być idealnym rozwiązaniem.