我有一个名为prefix存储“aaaa”的列的表。我的应用程序有一个很长的字符串,例如。'aaaabbbbccccdddd'。我想选择特定列是“aaaabbbbccccdddd”前缀的所有行。前缀的长度是可变的。
我怎样才能在 Postgres 中做到这一点?
我试过
SELECT * FROM my_table WHERE '%' || prefix || '%' ILIKE 'aaaabbbbccccdddd'
Run Code Online (Sandbox Code Playgroud)
但它不匹配。
首先,你的使用方式[I]LIKE是错误的:
Run Code Online (Sandbox Code Playgroud)string LIKE pattern
所以,字符串第一,模式第二。
此外,由于您仅在前缀之后,因此不需要起始通配符。这样的事情应该工作:
SELECT * FROM my_table WHERE 'aaaabbbbccccdddd' ILIKE prefix || '%';
Run Code Online (Sandbox Code Playgroud)
一个小证明:
WITH my_table (prefix) AS (
VALUES ('abcde'),
('abcd'),
('abcE'),
('bcde')
)
SELECT * FROM my_table WHERE 'abcdefghijkl' ILIKE prefix || '%';
prefix
????????
abcde
abcd
Run Code Online (Sandbox Code Playgroud)
另一种选择是创建所选单词的所有前缀,并针对表中的字符串使用相等性=(或ILIKE*)测试它们:
select t.prefix
from
(select 'aaaabbbbccccdddd'::text as word) as w,
generate_series(0, length(w.word)) as g,
lateral
(select t.prefix
from my_table as t
where t.prefix = left(w.word,g)
-- where t.prefix ilike left(w.word,g)
) as t ;
Run Code Online (Sandbox Code Playgroud)
这在大表中可能更有效,使用索引查找仅执行少数(与单词长度 +1 一样多)相等性检查,而不执行完整索引或表扫描。
* : 如果您需要不区分大小写的检查,ILIKE则应用作上面的注释代码。在这种情况下,'abcdefghijkl' ILIKE prefix || '%'答案的改进prefix是在左侧ILIKE而不是右侧使用了该列。因此,查询将执行一些column ILIKE 'aaabbbccdd'检查而不是(任意数量的)'aaabbbccdd' ILIKE column||'%'检查。
两种方式都有许多不同的ILIKE条件,但在一种情况下,该数字是搜索词的长度,另一种是表中的行数。
| 归档时间: |
|
| 查看次数: |
6750 次 |
| 最近记录: |