如何对包含以逗号分隔的字符串的列值执行搜索查询?

问题描述 投票:1回答:3

我有一个表格,如下所示

    date    |                            tags   |   name               
------------+-----------------------------------+--------         
 2018-10-08 | 100.21.100.1, cpu, del               ZONE1
 2018-10-08 | 100.21.100.1, mem, blr              ZONE2
 2018-10-08 | 110.22.100.3, cpu, blr               ZONE3
 2018-10-09 | 110.22.100.3, down, hyd              ZONE2
 2018-10-09 | 110.22.100.3, down, del              ZONE1

我想为在name列中具有某些字符串的那些行选择tags

此处tags列的值是包含逗号分隔值的字符串。

例如,我有一个字符串列表["down", "110.22.100.3"]。现在,如果我查看包含列表中字符串的表,则应该获得最后两行,分别具有名称ZONE2, ZONE1

现在我知道有一个叫做in的运算符,但是我不太确定如何在这里使用它。

我尝试过类似下面的内容

select name from zone_table where 'down, 110.22.100.3' in tags;

但是出现语法错误。该怎么办?

postgresql select search
3个回答
1
投票

您可以做这样的事情。

select name from zone_table where 
string_to_array(replace(tags,' ',''),',')@>
string_to_array(replace('down, 110.22.100.3',' ',''),',');

1)删除现有字符串中的空格以实现适当的string_to_array分隔,而使用replace则在开头没有空格]

2)string_to_array将您的字符串转换为以逗号分隔的数组。

3)@>contains运算符

(OR)

如果您想整体匹配

select name from zone_table where POSITION('down, 110.22.100.3' in tags)!=0

对于单独的比赛,您可以做

select name from zone_table where POSITION('down' in tags)!=0 and 
POSITION('110.22.100.3' in tags)!=0

关于位置here的更多信息


1
投票

我们可以在此处尝试使用LIKE运算符,并检查CSV标签列表中每个标签的存在:


© www.soinside.com 2019 - 2024. All rights reserved.