Korzystając z Postgres 9.0, potrzebuję sposobu na sprawdzenie, czy wartość istnieje w danej tablicy. Do tej pory wymyśliłem coś takiego:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Ale ciągle myślę, że powinien istnieć prostszy sposób, po prostu tego nie widzę. To wydaje się lepsze:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Wierzę, że to wystarczy. Ale jeśli masz na to inne sposoby, udostępnij je!
źródło
ANY/ALL (array) requires array on right side
, dodałem::int[]
uroku.'something' = ANY(some_array)
można je również wykorzystać wWHERE
klauzuli. Z powodów znanych tylko Cromowi przez ostatnie cztery lata myślałem, że nie mogę używać komparatorów tablicowych wWHERE
klauzulach. Te dni już minęły. (Zostałem upuszczony na głowę jako dziecko, więc może to tylko ja).boolean
wyrażenie działa wWHERE
klauzuli - Crom chętnie.Uważaj na pułapkę, w którą wpadłem: sprawdzając, czy pewna wartość nie jest obecna w tablicy, nie powinieneś:
ale użyj
zamiast.
źródło
ALL
vsANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
może być bardziej czytelnyMożesz porównać dwie tablice. Jeśli którakolwiek z wartości w lewej tablicy nakłada się na wartości w prawej tablicy, wówczas zwraca wartość true. To trochę hackish, ale działa.
1
znajduje się we właściwej tablicytrue
, mimo że wartość4
nie jest zawarta we właściwej tablicy4
) Nie znajdują się w prawej tablicy, więc zwracafalse
źródło
unnest
można również użyć. Rozszerza tablicę do zestawu wierszy, a następnie sprawdzenie, czy wartość istnieje lub nie jest tak proste, jak użycieIN
lubNOT IN
.na przykład
id => uuid
wyjątek_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
źródło
Podczas szukania istnienia elementu w tablicy wymagane jest odpowiednie rzutowanie, aby przekazać parser SQL postgres. Oto jedno przykładowe zapytanie wykorzystujące tablicę zawierającą operator w klauzuli złączenia:
Dla uproszczenia wymieniam tylko odpowiednią część:
Pokazano dołączoną część SQL
Działa również następujące
Zgaduję tylko, że wymagane jest dodatkowe rzutowanie, ponieważ analiza nie musi pobierać definicji tabeli, aby ustalić dokładny typ kolumny. Inni komentują to.
źródło
Cześć, ten działa dla mnie dobrze, może być użyteczny dla kogoś
wybierz * z tabeli_tabej, gdzie kolumna_kolumny :: tekst jest DOWOLNY (ARRAY ['% text_to_search%' :: text]);
źródło