获取恰好包含一个特殊字符的行

Get rows which contain exactly one special character

我有一个 SQL 查询,其中 return 一些行具有以下格式:

DB_host
DB_host_instance

我如何过滤以获取仅具有 'DB_host' 格式的行(将条件设置为 return 值且仅出现一次 '_')

我尝试使用 [0-9a-zA-Z_0-9a-zA-Z],但似乎不对。请提出建议。

一个简单的方法就是正则表达式:

where regexp_like(col, '^[^_]+_[^_]+$')

当有一个没有下划线的字符串后跟一个下划线后跟另一个没有下划线的字符串时,这会匹配完整的字符串。

您也可以使用 LIKE 来执行此操作,但更复杂:

where col like '%\_%' and col not like '%\_%\_%'

即有一个下划线但没有两个下划线。 \ 是必需的,因为 _LIKE 模式的通配符。

一个选项是使用 REGEXP_COUNT 并且最多需要一个下划线然后使用

WHERE REGEXP_COUNT( col, '_' ) <= 1

或者严格来说应该存在一个下划线然后使用

WHERE REGEXP_COUNT( col, '_' ) = 1

可以在字符串中去掉下划线,保证结果的长度只比原来少一个字符:

where len(replace(col, '_', '')) = len(col) - 1

我想知道就大型数据集的效率而言,此方法与一个或两个正则表达式相比如何。如果效率更高,我不会感到惊讶。