其中列不喜欢多个值

Jef*_*eff 14 postgresql optimization

我试图在 postgresql 数据库中选择记录,其中用户名不像字符串列表。

SELECT * FROM rails_db WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';
Run Code Online (Sandbox Code Playgroud)

问题是有很多这样的值。有没有办法创建一个数组并说如下:

SELECT * FROM rails_db WHERE username NOT LIKE ARRAY[my values];
Run Code Online (Sandbox Code Playgroud)

jja*_*nes 19

你几乎有正确的语法。这正是您想要的:

SELECT * FROM rails_db WHERE username NOT LIKE ALL(ARRAY[my values]);
Run Code Online (Sandbox Code Playgroud)

这是一种非常好的语法,但不一定很快,尤其是在数组很大的情况下。但是,您想要的很难优化性能,并且没有理由认为更丑陋的语法会更快。


Jef*_*eff 5

我可能已经找到了它,但我想看看这是否按预期的方式工作:

SELECT * FROM rails_db WHERE username !~* 'j.*|.*eepy.*';
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 5

您使用带有分支的正则表达式的想法是可靠的。但在你的回答中,%你对模式的翻译是LIKE错误的。这:

... WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';
Run Code Online (Sandbox Code Playgroud)

翻译为:

... WHERE username !~ '^j|eepy';
Run Code Online (Sandbox Code Playgroud)

!~区分大小写,例如NOT LIKE.
用于!~*匹配不区分大小写,例如NOT ILIKE. 还可以排除在任何地方
包含点 ( .)的字符串,并使用与字符串 末尾匹配(不匹配)的另一个示例,例如:username NOT LIKE '%end'

... WHERE username !~ '^j|end$|eepy|\.';
Run Code Online (Sandbox Code Playgroud)

可能也不是很快。