PSQL 到 TSQL 生成字符串序列

问题描述 投票:0回答:1

需要 TSQL 中的 PSQL 等效项

select 'P' || lpad(lvl, length('__'), '0') 
from (select level lvl from dual connect by level <= 14)

我只能访问 select 语句。

PSQL 结果是

P01
P02
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14

研究完成。 已使用 TSQL RIGHT 和 REPLICATE 使 LPAD 等效。需要了解级别并通过等效连接?

t-sql translation psql
1个回答
0
投票

在 T-SQL 中,没有与 Oracle 的

CONNECT BY
LEVEL
直接等效的函数,但您可以使用 公用表表达式 (CTE)
ROW_NUMBER()
函数来模拟此行为。以下是如何在 T-SQL 中获得与 PostgreSQL (PSQL) 查询相同的结果。

将 PSQL 查询转换为 T-SQL:

PSQL 查询:

SELECT 'P' || LPAD(lvl, LENGTH('__'), '0') 
FROM (SELECT LEVEL lvl FROM dual CONNECT BY LEVEL <= 14);

T-SQL 等效项:

WITH CTE_Level AS (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS lvl
    FROM sys.objects
)
SELECT 'P' + RIGHT(REPLICATE('0', 2) + CAST(lvl AS VARCHAR(2)), 2)
FROM CTE_Level
WHERE lvl <= 14;

说明:

  1. ROW_NUMBER():模拟 Oracle 的
    LEVEL
    。它为行分配一个唯一的连续整数,从 1 开始。
  2. sys.objects:这用作足够大的表来生成所需的行数。如果 14 行就足够了,这个系统表就可以正常工作。
  3. RIGHT(REPLICATE('0', 2) + CAST(lvl AS VARCHAR(2)), 2):这模拟
    LPAD
    REPLICATE('0', 2)
    函数用零填充
    lvl
    最多两个字符,并且
    RIGHT
    确保我们只采用最后两个字符(例如,
    01
    02
    03
    等)。
  4. WHERE lvl <= 14:将结果限制为前 14 行,类似于 Oracle 中的
    CONNECT BY LEVEL <= 14

输出:

P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14

这个 T-SQL 等效查询将为您提供所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.