SQL: Как разделить столбец по количеству символов - PullRequest
1 голос
/ 16 апреля 2020

У меня есть один столбец с буквами. Я хочу разделить эту колонку на три части. Какой SQL код для Microsoft мне понадобится? Я прочитал «разделить мой специальный символ», но я не уверен, как создать разделение по значению, где разделение также не ограничено количеством столбцов.

enter image description here

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Если вы действительно хотите сделать это динамически, как указано в вопросе, и у вас есть запрос, который создает столько столбцов, сколько вам нужно, тогда вам нужно Dynami c SQL.

Здесь является решением, использующим рекурсивный CTE для генерации строки запроса.

declare @sql nvarchar(max);

with cte as (
    select 
        1 pos, 
        cast('substring(code, 1, 3) col1' as nvarchar(max)) q, 
        max(len(code)) max_pos from mytable
    union all 
    select 
        pos + 1, 
        cast(
            q 
            + ', substring(code, ' + cast(pos * 3 + 1 as nvarchar(3)) 
            + ', 3) col' 
            + cast(pos + 1 as nvarchar(3)) 
        as nvarchar(max)), 
        max_pos
    from cte
    where pos < max_pos / 3
)
select @sql = N'select ' + q + ' from mytable' 
from cte 
where len(q) = (select max(len(q)) from cte);

select @sql sql;
EXEC sp_executesql @sql;

Якорь рекурсивного запроса вычисляет длину самой длинной строки в столбце code. Затем рекурсивная часть генерирует серию substring() выражений для каждого блока из 3 символов с динамическими c именами столбцов, такими как col1, col2 и так далее. Затем вы можете (отладить и) выполнить эту строку запроса.

Демонстрация на БД Fiddle :

-- debug
| sql                                                                                                                                 |
| :---------------------------------------------------------------------------------------------------------------------------------- |
| select substring(code, 1, 3) col1, substring(code, 4, 3) col2, substring(code, 7, 3) col3, substring(code, 10, 3) col4 from mytable |

-- results
col1 | col2 | col3 | col4
:--- | :--- | :--- | :---
ABC  | DEF  | GHI  |     
XYZ  | ABC  |      |     
JKL  | MNO  | PQR  | STU 
ABC  | DEF  |      |     
1 голос
/ 16 апреля 2020

Вы можете сделать:

select t.*, substring(col, 1, 3), substring(col, 4, 3), substring(col, 7, 3) 
from table t
0 голосов
/ 16 апреля 2020

Попробуйте это так, для этого не нужно никаких обобщений c SQL (при условии, что вы можете указать максимальное количество столбцов):

Сначала нам нужно определить макет сценарий для имитации вашей проблемы

DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(100));
INSERT INTO @tbl VALUES ('AB')
                       ,('ABC') 
                       ,('ABCDEFGHI') 
                       ,('XYZABC') 
                       ,('JKLMNOPQRSTU') 
                       ,('ABCDEF');

- Мы можем установить общую длину чанка. Попробуйте это с другими значениями ...

DECLARE @ChunkLength INT=3;

- Запрос

SELECT p.*
FROM
(
    SELECT t.ID
          ,CONCAT('Col',A.Nmbr) AS ColumnName
          ,SUBSTRING(t.YourString,(A.Nmbr-1)*@ChunkLength + 1,@ChunkLength) AS Chunk
    FROM @tbl t
    CROSS APPLY
    (
        SELECT TOP((LEN(t.YourString)+(@ChunkLength-1))/@ChunkLength) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values
    ) A(Nmbr)
) src   
PIVOT
(
    MAX(Chunk) FOR ColumnName IN(Col1,Col2,Col3,Col4,Col5,Col6 /*add the maximum column count here*/)
) p;                    

Идея вкратце:

  • Используя APPLY вызов мы можем создать построчно . Это вернет несколько строк на входную строку. Количество строк определяется вычисленным предложением TOP.
  • Мы используем по строкам сначала для создания имени столбца , а затем в качестве параметров в SUBSTRING().
  • Наконец, мы можем использовать PIVOT, чтобы возвратить это как горизонтальный список.

Один совет о результирующих наборах generi c:

Это может быть вроде религии , но - по крайней мере, с моей точки зрения - я бы предпочел fix результирующий набор с большим количеством пустых столбцов, а не в общем определенном набор. Потребитель должен знать формат результата заранее ...

Вы можете использовать точно такой же запрос, как динамически созданный оператор SQL. Единственное, что вам нужно изменить, - это фактический список имен столбцов в пункте IN PIVOT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...