Sql 用于过滤前置字符和后缀字符的简单正则表达式

Sql 用于过滤前置字符和后缀字符的简单正则表达式,sql,arrays,regex,postgresql,database-design,Sql,Arrays,Regex,Postgresql,Database Design,我的数据库中有一个字段,其中有一长串字符串,用逗号分隔。以下是几行示例: HAB DHAB,RAB,DAB HAB,RAB,DAB RAB,HAB, RAB,HAB,DAB 我的查询具有以下条件: WHERE description LIKE '%HAB%' 但它返回第二行,其中包含“DHAB”。 是否可以使用带有WHERE语句的正则表达式来完成此操作,以便我只获取列表中具有“HAB”(一个字符串)的条目,而不获取具有“DHAB”的条目?您可以使用 WHERE description ~

我的数据库中有一个字段,其中有一长串字符串,用逗号分隔。以下是几行示例:

HAB
DHAB,RAB,DAB
HAB,RAB,DAB
RAB,HAB, 
RAB,HAB,DAB
我的查询具有以下条件:

WHERE description LIKE '%HAB%'
但它返回第二行,其中包含“DHAB”。
是否可以使用带有
WHERE
语句的正则表达式来完成此操作,以便我只获取列表中具有“HAB”(一个字符串)的条目,而不获取具有“DHAB”的条目?

您可以使用

WHERE description ~ '(^|,)HAB($|,)'
正则表达式匹配

  • (^ |,)
    -字符串的开头或
  • HAB
    -文字子字符串
  • ($|,)
    -字符串结尾或

请参阅。

正则表达式功能强大,用途广泛,但价格昂贵。考虑一种不同的方法:将列表转换为实际数组,然后:

WHERE 'HAB' = ANY (string_to_array(description, ',')
或:

小提琴

后者可以使用GIN索引来支持,这使大型表的速度加快了几个数量级

CREATE INDEX ON tbl USING gin (string_to_array(description, ','));
相关的:

或考虑规范化的DB设计,以1∶N关系替换逗号分隔的值。相关的:


您可以使用
WHERE description(^ |,)HAB($|,)”
感谢您的回复。它正在数据库级别上工作。但对于一些人来说,当我在regexr.com中测试它时,它不包括HAB位于行的开头或末尾的情况。有什么我应该知道的吗?您正在测试一行有换行符的代码,请启用
m
modifier。对不起。我正在测试一个包含多个\n的字符串。我的错。是的,我会的,谢谢你。
CREATE INDEX ON tbl USING gin (string_to_array(description, ','));