我有一个表格,如下所示
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;
但是出现语法错误。该怎么办?
您可以做这样的事情。
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的更多信息
我们可以在此处尝试使用LIKE
运算符,并检查CSV标签列表中每个标签的存在: