如何在PostgreSQL中转换连接BY,在PostgreSQL存储过程中,此Oracle存储过程代码将如何转换

5uzkadbs  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(113)
select DECODE('''||v_month||''',''0'',''0'',regexp_substr('''||v_month||''',''[^,]+'', 1, level)) 
from dual 
connect BY regexp_substr('''||v_month||''', ''[^,]+'', 1, level) is not null

字符串
我试过使用chatgpt和https://www.sqlines.com/online来转换它,但它不能像预期的那样转换它。

nnvyjq4y

nnvyjq4y1#

您的代码不是有效的SQL,因为''0''''[^,]+''不是有效的字符串文字。您需要'0''[^,]+''''0''''''[^,]+'''
一旦你修复它,你就会得到:

SELECT DECODE(
         '''||v_month||''',
         '''0''',
         '''0''',
         REGEXP_SUBSTR('''||v_month||''','[^,]+', 1, LEVEL)
       ) 
FROM   DUAL 
CONNECT BY
       REGEXP_SUBSTR('''||v_month||''', '[^,]+', 1, LEVEL) IS NOT NULL

字符串
'''||v_month||'''是一个字符串字面量;它没有在变量前加上一个单引号,所以你的查询可以简化为:

SELECT '''||v_month||'''
FROM   DUAL


在PostgreSQL中,这将是:

SELECT '''||v_month||'''


如果你确实想递归遍历一个逗号分隔的字符串,那么在Oracle中,你可以使用递归查询和简单的字符串函数:

WITH data (value) AS (
  SELECT v_month FROM DUAL
),
bounds (value, spos, epos) AS (
  SELECT value, 1, INSTR(value, ',', 1)
  FROM   data
UNION ALL
  SELECT value, epos + 1, INSTR(value, ',', epos + 1)
  FROM   bounds
  WHERE  epos > 0
)
SELECT CASE epos
       WHEN 0
       THEN SUBSTR(value, spos)
       ELSE SUBSTR(value, spos, epos - spos)
       END AS month
FROM   bounds


PostgreSQL有一个string_to_array函数,它会自动执行,然后你可以用unnest来转换为行:

SELECT UNNEST(string_to_array(v_month, ','))


Oracle fiddlePostgreSQL fiddle的数据库

相关问题