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

Python 在列字段中查找相同的标记PostgreSQL,python,regex,database,postgresql,Python,Regex,Database,Postgresql,嗨,我需要在列字段中找到相同的标记 我的问题是: 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 它返回了很多列,我只需要离开,并

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

我的问题是:

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)

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

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}

如果您使用
数组['Sussi']是否回答了您的问题?我尝试使用regexp_匹配(tags_field),(Sussi)(Pizza)”,但它返回空字段
(?=.*\yPizza\y)(?=.*\ySushi\y)
,我认为这不是Python正则表达式引擎。为什么要使用它的标签?@Wiktor Stribiżew thx你,但我找不到解决问题的方法在消除所有这些恶意空格后,你应该在代码中添加修剪函数以正确处理数据。这是错误的离开他们。谢谢你,你的解决方案真的很有帮助,它几乎解决了我的问题,我会测试它,并作出答复的结果
ARRAY['Sussi','Pizza'] = ARRAY['Pizza','Sussi'] -- for the *is contained by* validation
' 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}
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;
SELECT rest_id, tags_field
FROM data
WHERE
    ARRAY['Pizza','Sussi'] <@ tags_field;