示例数据:
'255002001255255001255001004002255007002'
有一个公式,每3个字符属于一个组,在这3个字符中,数字属于ID。例如,前3个字符“ 255”属于组1,而255与另一个表中的ID相关。
255
002
001
255
255
001
255
001
004
002
255
007
002
我需要将每3个字符存储在一个表的上方值中。我想使用存储此信息的CTE,以便可以在查询中引用它以生成报告。它是第三方数据库,所以我只有读权限。
我考虑过使用SUBSTRING(tablevalue, 1,3)
,但不知道如何继续使用整个值
答案 0 :(得分:3)
您可以使用递归CTE。例如:
with cte as (
select left(@str, 3) as group_id, substring(@str, 4, len(@str)) as rest
union all
select left(rest, 3) as group_id, substring(rest, 4, len(rest)) as rest
from cte
where len(rest) >= 3
),
groups as (
select group_id
from cte
),
. . .
数据库的字符串函数略有不同,因此确切的函数取决于数据库。而且,某些数据库需要使用recursive
关键字。
答案 1 :(得分:2)
在使用递归CTE的SQL Server中:
WITH Strings(ID, String) AS (
SELECT 1, '255002001255255001255001004002255007002' UNION ALL
SELECT 2, '3334445556667778889990001112223334445556' UNION ALL
SELECT 3, '44455566677788899900011122233344455566677'
), Numbers AS (
SELECT 1 AS Number
UNION ALL
SELECT Number + 1
FROM Numbers
WHERE Number + 1 <= 100
)
SELECT String, Number, SUBSTRING(String, (Number - 1) * 3 + 1, 3) AS Result
FROM Strings
INNER JOIN Numbers ON Number <= CEILING(LEN(String) / 3.0)
ORDER BY String, Number
实际上不需要递归CTE。几乎任何产生序号的技术都可以使用,例如几行的任何表上的数字表或row_number的表。
答案 2 :(得分:1)
如果是Oracle,则可以执行以下操作:
SQL> with test (col) as
2 (select '255002001255255001255001004002255007002' from dual)
3 select substr(col, 3 * (level - 1) + 1, 3) subs
4 from test
5 connect by level <= length(col) / 3;
SUBS
------------
255
002
001
255
255
001
255
001
004
002
255
007
002
13 rows selected.
SQL>