SQL - 查找作为我的字符串前缀的记录

fil*_*ilo 3 postgresql

我有一个名为prefix存储“aaaa”的列的表。我的应用程序有一个很长的字符串,例如。'aaaabbbbccccdddd'。我想选择特定列是“aaaabbbbccccdddd”前缀的所有行。前缀的长度是可变的。

我怎样才能在 Postgres 中做到这一点?

我试过

SELECT * FROM my_table WHERE '%' || prefix || '%' ILIKE 'aaaabbbbccccdddd'
Run Code Online (Sandbox Code Playgroud)

但它不匹配。

dez*_*zso 7

首先,你的使用方式[I]LIKE错误的

string LIKE pattern 
Run Code Online (Sandbox Code Playgroud)

所以,字符串第一,模式第二。

此外,由于您仅在前缀之后,因此不需要起始通配符。这样的事情应该工作:

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)


ype*_*eᵀᴹ 6

另一种选择是创建所选单词的所有前缀,并针对表中的字符串使用相等性=(或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条件,但在一种情况下,该数字是搜索词的长度,另一种是表中的行数。