postgresql 基于脱机表查询匹配模式

ma8fv8wu  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(106)

我是PostgreSQL的新手。我目前正在使用第三方PostgreSQL数据库,我的READ权限有限,所以我无法创建临时表或创建“用户定义”变量。此外,我发现在Postgres中处理正则表达式比MySQL更困难。
问:
我有下面的dummy table:

Code   |  Name
11199  |  a
22299  |  b
33399  |  c
44499  |  a
55599  |  c

字符串
现在我有了一个离线的数字列表(不能在这个数据库中创建/修改表)。我需要选择其代码以这些数字开头的名称-但返回代码应该是查询语句中的代码。
数字示例列表:

1
2
3
4
5


所需查询结果:

code  |   name
1     |   a
2     |   b
3     |   c
4     |   a
5     |   c


如果我有更多的db权限,我可以想到一些方法来完成它(比如将列表插入到数据库中的一个表中,加上使用临时表+如果我可以像在mysql中那样使用regex),但我不知道在Postgres上从哪里开始。Help?:)

siv3szwd

siv3szwd1#

就像这样:

-- using cte as your list of numbers
with cte as (
   select unnest(array[1, 2, 3, 4, 5]) as Number
)
select c.Number, t.name
from Table1 as t
    inner join cte as c on t.code::text like c.Number::text || '%'

字符串

sql fiddle demo

jecbmhm3

jecbmhm32#

重新审视你的假设。正则表达式是Postgres中一个基本的标准特性。还有一些使用正则表达式的内置函数。
但是这里你不需要正则表达式。使用标准SQL LIKE运算符。请参阅:

您可以将列表作为数组和unnest()as demonstrated by Roman提供,也可以使用VALUES expression直接与ad-hoc表一起提供。我 * 假设 *,多行可以匹配,并且您只希望列表中的每个数字都有一个结果:

SELECT n.nr, array_agg(t.name) AS names
FROM  (VALUES (1), (2), (3), (4), (5)) n(nr)
JOIN   tbl t ON t.code LIKE (n.nr || '%')
GROUP  BY 1;

字符串

大单子高级解决方案

如果你有一个(大)文件持有数字(和必要的特权!),您可以使用更高级的技术,例如:

  • COPY到临时表
  • pg_read_file()(用于特殊用途,需要超级用户权限)
  • 文件(file_fdw)上的外部数据 Package

相关信息:

  • 从触发器内的文本文件读取数据

相关问题