Sql 如何通过查询将40302402转换为40/302/4/02

Sql 如何通过查询将40302402转换为40/302/4/02,sql,postgresql,Sql,Postgresql,使用查询将“4030240201”转换为“40/3/02/40/201” 我尝试使用query将“4030240201”转换为“40/3/02/40/201”,但失败。我有位置和数字要从表中选择 这可以通过递归查询完成吗?怎么做 With Recursive s As ( select fd.ilevel_pos, fd.ilevel_digits, substr(trim('4030240201'), ilevel_pos::Integer, ilevel_digits::Integer)

使用查询将“4030240201”转换为“40/3/02/40/201”

我尝试使用query将“4030240201”转换为“40/3/02/40/201”,但失败。我有位置和数字要从表中选择

这可以通过递归查询完成吗?怎么做

With Recursive s As (
  select fd.ilevel_pos, fd.ilevel_digits, substr(trim('4030240201'), ilevel_pos::Integer, ilevel_digits::Integer) || '/' as test 
  from index_detail fd
    join index_format lf on fd.formatid = lf.format_id and lf.activeFlag = 1
  Where ilevel_pos <= length(Trim('4030240201'))
    And ilevel_pos = 1
  Union All
  select fd.ilevel_pos, fd.ilevel_digits, substr(trim('4030240201'), fd.ilevel_pos::Integer, fd.ilevel_digits::Integer) || '/' as test 
  from index_detail fd
    join index_format lf on fd.formatid = lf.format_id and lf.activeFlag = 1
    join S ON (s.ilevel_pos = fd.ilevel_pos)
  Where fd.ilevel_pos <= length(Trim('4030240201'))
)
Select test 
From s;

我预期为“40/3/02/40/201”,但实际输出为“40/”

如果我正确理解您的问题,为什么不使用子字符串中的位置

with list as ( select '40231' as test, 2 as pos, 3 as leng) 
select substring(test, pos, leng) from list
编辑:

对于postgres,必须更改concat运算符

with testing as ( select '40302402' as test, 1 as pos1, 2 as leng1,3 as pos2, 3 as leng2) 
select substring(test, pos1, leng1) || '/' || substring(test, pos2, leng2) ||'/' from testing

尝试将包含40302402值的变量声明为输入值

然后,尝试执行一个continue substr选择

然后将每个项目合并成一行

设置输入值:='40302402';这可能需要修复

选择 选择concatT.Var1',/',T.Var2',/',T.Var3',/',T.Var4 从…起 选择 子字符串输入_值,1,2为Var1, 子字符串输入_值,3,3为Var2, 子字符串输入_值,5,1为Var3, 子字符串输入_值,6,2为Var4 AS T 作为形成价值;

以上未使用变量进行测试

下面的硬编码版本100%有效

选择 选择concatT.Var1',/',T.Var2',/',T.Var3',/',T.Var4 从…起 选择 子串'40302402',1,2作为变量1, 子串'40302402',3,3作为变量2, 子串'40302402',5,1作为变量3, 子串'40302402',6,2作为变量4 AS T 作为形成价值;

问候 迪恩

参考文献:


如果这是一个重要的操作,我会建议你确保它能始终如一地工作,这样你的查询就不会太大,也不难阅读了。这样做的规则是什么?为什么不是403/024/02或40/30/24/02?有多少行?位置或编号是否固定?你能做一把小提琴吗?顺便说一句,这里有一个选择,把charCAST'40302402'选为BIGINT,'09/999/9/99'@tadman谢谢你建议我使用这个功能,但是为了避免我在查询中尝试的多个for循环,您需要包括一个格式化版本的sting,如40/302/4/02@DeanVanGreunen我对我的答案进行了编辑,这就是你所指的吗?是的,但是你为什么要使用列表?还有,这个编译吗?@Deanvangreuenn我没有使用列表,它只是CTE的通用名称。它在MSSQL上运行得很好,我将再添加两个编辑来显示我所说的CTE的名称,并更改为使用PostgreSQL concatoh,是的,对不起,小忙人正在使用该站点测试代码,哈哈
with list as ( select '40302402' as test, 1 as pos1, 2 as leng1,3 as pos2, 3 as leng2) 
select substring(test, pos1, leng1)+'/' + substring(test, pos2, leng2)+'/' from list

with testing as ( select '40302402' as test, 1 as pos1, 2 as leng1,3 as pos2, 3 as leng2) 
select substring(test, pos1, leng1)+'/' + substring(test, pos2, leng2)+'/' from testing
with testing as ( select '40302402' as test, 1 as pos1, 2 as leng1,3 as pos2, 3 as leng2) 
select substring(test, pos1, leng1) || '/' || substring(test, pos2, leng2) ||'/' from testing