I have a table projects
with a column operating_sytem
which is an enum array like shown below:
Furthermore, I have an array like ['ios', 'windows']
and I want to select all the projects that have in operating_system column any value of the array
So it should return 1st, 4th, 7th and 9th occurrence
I tried:
SELECT * FROM public.projects
WHERE operating_system = ANY (['ios', 'windows']);
but it returned an error:
ERROR: syntax error at or near "[" LINE 2: WHERE operating_system = ANY (['ios', 'windows']);
How can I do this query?
CodePudding user response:
You are confusing the syntax of array constructor and array literal (array constant):
What's more, an array constructor would require an explicit cast, else text
is assumed, and there is almost certainly no operator for operation_system_enum = text
in your system.
So these would work with array constructor if operating_system
was indeed a single operating system like the name implies:
... WHERE operating_system = ANY (ARRAY['ios'::operation_system_enum, 'linux']);
... WHERE operating_system = ANY (ARRAY['ios', 'linux']::operation_system_enum[]);
Or simpler with an (optionally untyped) array literal:
... WHERE operating_system = ANY ('{ios, linux}');
Here, the eventual type can be derived from the expression. See:
Actual answer
But since operating_system
is actually type operation_system_enum[]
, so an array of operating systems, you really need the array "overlaps" operator &&
, like Oto suggested:
... WHERE operating_system && ARRAY['ios'::operation_system_enum, 'linux'];
Or simpler with an (untyped) array literal:
... WHERE operating_system && '{ios, linux}';
The last one is the way to go.
Only expressions with array operators can tap into a GIN index to begin with. See: