在列字段中查找相同的标记PostgreSQL

2024-09-26 18:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我需要在列字段中找到相同的标记

我的问题是:

select *, from 
(SELECT *,  string_agg(DISTINCT "tags".tag, ',') as tags_field
            from restaurants
            left JOIN tags on rest.rest_id = tags.rest_id
            GROUP by rest_id) x

它返回了很多列,我只需要离开,并请求帮助

rest_id  tags_field
1        "Sussi,Burger"
2        "Sussi,Pizza"
3        "Seafood"
4        "Sussi,Vok,Beer"
5        "Sussi, Pizza"

从后端我将搜索像Sussi这样的标记,在这种情况下,它应该返回1,2,4,5行 如果我需要Sussi,Pizza,它应该只返回1,2,并且顺序应该无关紧要

例如,我在sqlite上尝试了它,我用regexp解决了它,但是如何在posgtresql上实现它呢

tags_field REGEXP ^(?=.*\bPizza\b)(?=.*\bSushi\b)

Tags: from标记restidfieldstringtagtags
1条回答
网友
1楼 · 发布于 2024-09-26 18:14:18

可以将文本列转换为数组并使用数组比较

SELECT *
FROM
    (SELECT rest_id, string_to_array(trim(tags_field), ',') as tags_field FROM data) data
WHERE
    ARRAY['Pizza','Sussi'] <@ tags_field;   query clause
  THIS RETURNS
  2 {Sussi,Pizza}

<@表示包含在中。这意味着tags_field必须有比萨饼和苏西才是真的。因为它是一个数组,所以顺序并不重要。所以

ARRAY['Sussi','Pizza'] = ARRAY['Pizza','Sussi']   for the *is contained by* validation

如果您使用ARRAY['Sussi'] <@ tags_field,您将得到id:1,2,4,5

这不会搜索“Pizza”,因为Pizza之前有空间

' Pizza' != 'Pizza'   Remember PostgreSQL is case sensitive and every space matters.

要查找每个比萨饼,您必须预处理数据并删除不必要的空间不推荐,但可能

SELECT *
FROM(
    SELECT 
        rest_id,
        string_to_array(
            trim(  Remove spaces after and before text
                regexp_replace(
                    regexp_replace(
                        regexp_replace(
                            tags_field,
                            '\s+', ' ', 'g'),   Replace multiple spaces to one space.
                        ', ',',','g'   Remove space after coma
                    ),
                    ' ,',',','g'   Remove space before coma
                )
            ),
            ','   Delimitador for array
        )as tags_field 
    FROM data
) data_mod
WHERE
    ARRAY['Pizza','Sussi'] <@ tags_field;   query clause
  THIS RETURNS
  2 {Sussi,Pizza}
  5 {Sussi,Pizza}

在前面的查询中,您将得到ID2和ID5,因为不再有带空格的“Pizza”

正确的方法是通过更新修复您的恶意空间,更好的方法是使用array而不是text作为tags_字段,但是array部分意味着更改您的数据库结构,以便。。。我们将继续更新:

UPDATE data SET tags_field = trim(  Remove spaces after and before text
    regexp_replace(
        regexp_replace(
            regexp_replace(
                tags_field,
                '\s+', ' ', 'g'),   Multiple spaces to one space.
            ', ',',','g'   remove space after coma
        ),
        ' ,',',','g'   remove space before coma
    )
);

更新后,您的查询将是:

SELECT *
FROM
    (SELECT rest_id, string_to_array(tags_field, ',') as tags_field FROM data) data
WHERE
    ARRAY['Pizza','Sussi'] <@ tags_field;

不需要修剪

如果更改表结构并使用array而不是text,查询将更容易:

SELECT rest_id, tags_field
FROM data
WHERE
    ARRAY['Pizza','Sussi'] <@ tags_field;

相关问题 更多 >

    热门问题