1

我是 PostgreSQL 新手。我目前正在开发第 3 方 PostgreSQL 数据库,并且我的 READ 权限有限,因此我无法创建临时表或创建“用户定义”变量。此外,我发现在 Postgres 中处理正则表达式比在 MySQL 中更困难。

问题:
我有以下虚拟表:

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

如果我有更多的数据库权限(例如将列表插入数据库中的表,加上使用临时表+如果我可以像在 mysql 中使用正则表达式),我可以想办法完成它,但我不知道在哪里从 Postgres 开始。帮助?:)

4

2 回答 2

3

像这样的东西:

-- 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

于 2013-10-20T21:04:03.580 回答
0

重新审视你的假设。正则表达式是 Postgres 中一个基本的标准特性。还有许多使用 regex 的内置函数

不过,这里不需要正则表达式。使用标准 SQLLIKE运算符。在 dba.SE 上的相关答案中对 Postgres 中的模式匹配进行了概述:

您可以将列表作为数组提供,unnest() 如 Roman 所演示的,或者直接使用VALUES表达式提供临时表。我还假设,多行可以匹配,并且您只希望列表中的每个数字有一个结果:

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)

详细的相关答案:
从触发器内的文本文件中读取数据

Depesz 博客中的外国数据包装器示例。

于 2013-10-20T22:11:44.207 回答