通过将值分成三个字符块来生成行

时间:2018-07-06 19:54:21

标签: sql sql-server string

示例数据:

'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),但不知道如何继续使用整个值

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

SQL Fiddle

实际上不需要递归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>