I need to test if any part of a column value is in a given string, instead of whether the string is part of a column value. For instance:
This way, I can find if any
This query:
SELECT
regexp_split_to_table(
'The ships hung in the sky in much the same way that bricks don’t',
'\s' );
gives a following result:
| regexp_split_to_table |
|-----------------------|
| The |
| ships |
| hung |
| in |
| the |
| sky |
| in |
| much |
| the |
| same |
| way |
| that |
| bricks |
| don’t |
Now just do a semijoin against a result of this query to get desired results
SELECT * FROM table t
WHERE EXISTS (
SELECT * FROM (
SELECT
regexp_split_to_table(
'The ships hung in the sky in much the same way that bricks don’t',
'\s' ) x
) x
WHERE t.column LIKE '%'|| x.x || '%'
)
Your simple case can be solved with a simple query using the ANY
construct and ~*
:
SELECT *
FROM tbl
WHERE col ~* ANY (string_to_array('The ships hung in the sky ... bricks don’t', ' '));
~*
is the case insensitive regular expression match operator. I use that instead of ILIKE
so we can use original words in your string without the need to pad %
for ILIKE
. The result is the same - except for words containing special characters: %_\
for ILIKE
and !$()*+.:<=>?[\]^{|}-
for regular expression patterns. You may need to escape special characters either way to avoid surprises. Here is a function for regular expressions:
But I have nagging doubts that will be all you need. See my comment. I suspect you need Full Text Search with a matching dictionary for your natural language to provide useful word stemming ...
Related: