debugsqlMinor
ERROR: operator does not exist: text[] ~~ text
Viewed 0 times
erroroperatortextexistdoesnot
Problem
We have an easy syntax that allows us to look into an array for a single scalar,
We can use the same method to match with
My question is what if you want to do it the other.
I know that syntax doesn't work, but I have expected this to work.
I want to filter an array to see if an element exists. Is this possible without using
SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);We can use the same method to match with
LIKESELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];My question is what if you want to do it the other.
SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%'
ERROR: syntax error at or near "ANY"
LINE 1: SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%';I know that syntax doesn't work, but I have expected this to work.
# SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
ERROR: operator does not exist: text[] ~~ unknown
LINE 1: SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%';
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.I want to filter an array to see if an element exists. Is this possible without using
unnest?Solution
The Postgres manual suggests you might have a design issue:
Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.
You can make your operator more efficient — it's better if it stops checking after the first match:
dbfiddle here
Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.
You can make your operator more efficient — it's better if it stops checking after the first match:
CREATE OR REPLACE FUNCTION like_in_array( arr text[], pattern text )
RETURNS bool AS $
SELECT coalesce(( SELECT true
FROM unnest(arr) AS u(n)
WHERE n LIKE pattern
LIMIT 1),false);
$ LANGUAGE sql
IMMUTABLE;dbfiddle here
Code Snippets
CREATE OR REPLACE FUNCTION like_in_array( arr text[], pattern text )
RETURNS bool AS $$
SELECT coalesce(( SELECT true
FROM unnest(arr) AS u(n)
WHERE n LIKE pattern
LIMIT 1),false);
$$ LANGUAGE sql
IMMUTABLE;Context
StackExchange Database Administrators Q#194451, answer score: 3
Revisions (0)
No revisions yet.