PostgreSQL Reverse LIKE

后端 未结 2 1478
梦毁少年i
梦毁少年i 2020-12-22 02:32

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

2条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-22 03:10

    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:

    • Escape function for regular expression or LIKE patterns

    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:

    • IN vs ANY operator in PostgreSQL
    • PostgreSQL LIKE query performance variations
    • Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL

提交回复
热议问题