【问题标题】:Postgresql select where array overlaps using likePostgresql 使用 like 选择数组重叠的位置
【发布时间】:2022-01-24 16:00:59
【问题描述】:

是否可以使用 LIKE 子句确定 ARRAY 列是否包含来自另一个数组的重叠值?

&& 运算符有效,但字符串必须完全匹配

 q = """select * from articles where keywords && '{"mortgage brokers"}';""" // Exact match

是否可以过滤行包含 substring 值的关键字,而不是完整的字符串?比如:

 q = """select * from articles where keywords && LIKE '{"mortgage"}';""" // HOW TO FILTER keywords containing value with substring

【问题讨论】:

    标签: sql postgresql sqlalchemy


    【解决方案1】:

    LIKE 对字符串进行操作。要检查两个数组是否重叠,可以使用&&

    来自the Array Functions and Operators documentation

    &&:重叠(有共同的元素)

    SELECT ARRAY[1,4,3] && ARRAY[2,1] arrays_overlap;
    
    | arrays_overlap |
    | -------------- |
    | true           |
    

    要查看一个数组中是否有 LIKE 来自另一个数组的值,一种解决方案是取消嵌套两个数组并将结果与​​ LIKE 进行比较:

    SELECT EXISTS (
      SELECT 1
        FROM 
        unnest(ARRAY['abc', 'def' ]) my_array(x)
        INNER JOIN unnest (ARRAY['a', 'z' ]) my_keywords(x)  
            ON my_array.x LIKE '%' || my_keywords.x || '%'
     ) arrays_have_similar_elements;
    
    | arrays_have_similar_elements |
    | ---------------------------- |
    | true                         |
    
    SELECT EXISTS (
      SELECT 1
        FROM 
        unnest(ARRAY['abc', 'def' ]) my_array(x)
        INNER JOIN unnest (ARRAY['y', 'z' ]) my_keywords(x)  
            ON my_array.x LIKE '%' || my_keywords.x || '%'
     ) arrays_have_similar_elements;
    
    | arrays_have_similar_elements |
    | ---------------------------- |
    | false                        |
    

    Demo on DB Fiddle

    【讨论】:

    • 可以合并&&like 吗? && 只返回完全匹配的结果
    • @kye:啊,我明白你现在的意思了。我更新了我的答案。
    【解决方案2】:

    感谢@GMB 的指导。我能够使用下面的查询解决问题。

          SELECT * from articles, unnest(keywords) my_array(x)
                INNER JOIN unnest(ARRAY['broker']) my_keywords(x)
                ON my_array.x LIKE '%' || my_keywords.x || '%';
    

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-11-14
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多