首页 > 解决方案 > 如何给出与用逗号分隔的括号内给出的任何值匹配的sql的like运算符,并且这些值可以是任何顺序

问题描述

我有一列说国家列当我触发查询值时

|Country|
|US,UK,Canada|
|India,Pak,Bangladesh|
|Israel,Sudan,Africa|

现在,当我使用 where 过滤出国家时,例如

select * from country where Country = 'US,UK,Canada' 

那么它给出了非常好的结果, |US,UK,Canada| 但是假设 Country 列显示的数据如下

|Country|
|Canada,UK,US|
|India,Pak,Bangladesh|
|Israel,Sudan,Africa|

那么上面的查询将不起作用。

我想要一种方法,当用逗号分隔的单元格值按任何顺序排列时,它就像Canada,UK,US or US,Canada,UK etc .

我不知道如何使用 SQL 的 like 运算符来处理这个问题

标签: sqlpostgresql

解决方案


在列中存储 CSV 是设计不佳的一个示例。您应该使用复杂类型(数组)或规范化您的架构。


使用数组比较的解决方法(假设列中的所有元素都是唯一的):

WITH cte AS (
  SELECT *, ('{' || country || '}')::text[] AS a_country
  FROM Country
)
SELECT *
FROM cte
WHERE a_country <@ ('{' || 'Canada,UK,US' || '}')::text[]
  AND a_country @> ('{' || 'Canada,UK,US' || '}')::text[];

db<>小提琴演示


推荐阅读