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;