从逗号分隔值搜索

Ahm*_*had 0 sql postgresql

我有包含列的用户表,city_id在此列中城市 ID 存储为逗号分隔值,如下所示:

用户

user_id  user_name     city_id    
1        ahmar_arshad   1,2,3
2        abdul_muiz     15,2,9
3        abdul_momin    1,2,13
Run Code Online (Sandbox Code Playgroud)

现在我想id = 1city_id列中搜索包含城市的行。

怎么做?

Tim*_*sen 5

这是一个通用的解决方案,它应该适用于 Postgres:

SELECT *
FROM yourTable
WHERE ',' || city_id || ',' LIKE '%,1,%';
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

演示

这里的技巧是比较表格中城市 ID 的 CSV 列表,例如,,1,2,3,针对,ID,,其中ID可以是任何单个城市 ID。

请注意,最好将您的表格标准化并将这些城市 ID 存储在单独的记录中,而不是存储在 CSV 字符串中。这将使查询数据更容易,并且可能还会提高性能。


小智 5

如果将该逗号分隔列表转换为数组,则可以使用 Postgres 强大的数组运算符:

select *
from cities
where '1' = any (string_to_array(city_id, ','));
Run Code Online (Sandbox Code Playgroud)

如果您需要查找具有多个 ID 之一的行

select *
from cities
where string_to_array(city_id, ',') && array['1', '2']
Run Code Online (Sandbox Code Playgroud)

&&是数组的“重叠”运算符。如果您需要查找包含所有 ID 列表的行:您可以使用 contains 运算符:

select *
from cities
where string_to_array(city_id, ',') @> array['1', '2']
Run Code Online (Sandbox Code Playgroud)