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)
这是一种非常好的语法,但不一定很快,尤其是在数组很大的情况下。但是,您想要的很难优化性能,并且没有理由认为更丑陋的语法会更快。
我可能已经找到了它,但我想看看这是否按预期的方式工作:
SELECT * FROM rails_db WHERE username !~* 'j.*|.*eepy.*';
Run Code Online (Sandbox Code Playgroud)
您使用带有分支的正则表达式的想法是可靠的。但在你的回答中,%
你对模式的翻译是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)
可能也不是很快。
归档时间: |
|
查看次数: |
39065 次 |
最近记录: |