在 postgresql 中按级别和 regexp_substr 连接

Posted

技术标签:

【中文标题】在 postgresql 中按级别和 regexp_substr 连接【英文标题】:Connect by Level & regexp_substr in postgres Sql 【发布时间】:2019-12-18 18:00:31 【问题描述】:

我正在将查询从 oracle 迁移到 postgres sql。我面临函数 regexp_substr 和 regexp_substr 双重连接的问题。这是查询,

SELECT 
ID,
DATE,
ADDRESS,
NAME,
LASTNAME,
DATEOFBIRTH,
AGID
FROM (
SELECT DISTINCT 
App.AggId AS AggId, 
App.Id AS Id,  
App.LastName AS LastName, 
App.Name AS Name,
App.Date AS Date, 
App.DateOfBirth AS DateOfBirth, 
App.Address AS Address, 
FROM 
App App
WHERE    
App.DATE between ?DateCreatedFrom and (?DateCreatedTo) and 
(?dFrom=-999 or App.ID>=?IdFrom) and
(IdTo = -999 or App.ID <= ?IdTo) and
(?AgId = 'ALL' or App.AGID in (  select regexp_substr( ?AgId,'[^,]+', 1, level) from dual
connect by regexp_substr( ?AgId, '[^,]+', 1, level) is not null       ) ) and
(?LastName = 'null' or App.LASTNAME = ?LastName) and
(?Name = 'null' or App.NAME = ?Name) 
ORDER BY ID DESC 

请帮助我在 postgres 中运行此查询

【问题讨论】:

仅供参考:v9.2 和 v9.3 均已停产,因此旧版本不受支持。如果您可以选择从较新的版本开始,您应该这样做。 【参考方案1】:

我相信

select regexp_substr( ?AgId,'[^,]+', 1, level) from dual
connect by regexp_substr( ?AgId, '[^,]+', 1, level) is not null;

等同于:

SELECT unnest(string_to_array(?AgId, ','));

我不是 Oracle 语法专家,但我相信它只是将 ',' 上的字符串拆分为多行。

您也可以使用 regexp_split_to_table,但它往往比 unnest(string_to_array...

【讨论】:

以上是关于在 postgresql 中按级别和 regexp_substr 连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 regexp_substr 在 Oracle 中按空格和字符拆分字符串作为分隔符

如何在 PostgreSQL 中按时间间隔聚合行数?

Postgresql 中的 REGEXP_REPLACE 不是子字符串

Postgresql regexp_replace() 反斜杠和双引号

在 PostgreSQL 中按字母顺序搜索朋友

在 postgresql 中按月和年对查询结果进行分组