Генерация строк путем разделения значения на три части символов

Пример данных:

'255002001255255001255001004002255007002'

Существует формула, согласно которой каждые 3 символа принадлежат группе, и в пределах этих 3 символов номер принадлежит идентификатору. Например, первые 3 символа '255' относятся к группам 1 и 255, связанным с идентификатором в другой таблице.

255
002
001
255
255
001
255
001
004
002
255
007
002

Мне нужно сохранить каждые 3 символа в значении выше, которое исходит из таблицы. Я хочу использовать CTE, который хранит эту информацию, поэтому я могу ссылаться на нее в запросе для создания отчета. Его база данных сторонних разработчиков, поэтому я имею доступ только для чтения.

Я думал об использовании SUBSTRING(tablevalue, 1,3), но не знаю, как продолжать делать это для всей ценности

sql,sql-server,string,

-2

Ответов: 3


3 принят

Вы можете использовать a с cte as ( select left (@ str , 3 ) как group_id , substring (@ str , 4 , len (@ str )), так как rest union все выбирает left ( rest , 3 ) как group_id , substring ( rest , 4 , len ( rest )) как отдых от cte, где len ( rest ) > = 3 ), группы as ( выберите group_id from cte ) . , , КТР. Например:

recursive

Базы данных немного различаются в строковых функциях, поэтому точная функция зависит от БД. И некоторые базы данных требуют recursiveключевое слово.


2

В SQL Server с использованием рекурсивного CTE:

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 на любой таблице с несколькими строками.


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>
SQL, SQL-сервер, строка,
Похожие вопросы