2017-11-04 67 views
0

我发现PostgreSQL类似于运营商的作品有点奇怪。我不小心检查了下面查询中的空间,但对结果感到惊讶。PostgreSQL类似于运营商行为

select 'Device Reprocessing' similar to '%()%' --return true select 'Device Reprocessing' similar to '%()%' --return true select 'DeviceReprocessing' similar to '%()%' --return true

为什么第2和第3个查询返回true?空模式总是返回true吗?

我对SIMILAR TO操作符的理解是返回true或false,取决于它的模式是否与给定的字符串匹配。

+1

有使用'相似TO'没有意义的。永远。我使用'LIKE'或正则表达式代替。 https://stackoverflow.com/questions/12452395/difference-between-like-and-in-postgres/12459689#12459689 –

回答

2

你已经定义了一个没有任何东西的组,这意味着任何东西都会匹配。我想你会发现任何字符串匹配%()%,即使是一个空字符串。

通常你会使用这个分组列出选项,以便:因为它包含了既不是“达芬奇”,也不是“狗”

select 'DeviceReprocessing' similar to '%(Davinci|Dog)%' 

将返回false,但这样的:

select 'DeviceReprocessing' similar to '%(vice|Dog)%' 

将返回true。因为它确实包含至少一个选项。

您的第一个条件是真的,因为表达式确实包含空格。

其实我更喜欢的正则表达式表示法不需要%通配符:

select 'DeviceReprocessing' ~ 'vice|Dog'