Логика SQL для разделения значений - PullRequest
0 голосов
/ 08 октября 2018

У меня есть столбец со значениями ниже, и я хочу разбить значения на несколько значений столбца

Первые 4 символа представляют код местоположения. Вторые 3 символа представляют код стоимости. Последние 6 символов представляют код счета

COLUMN A
---------------
AA12.F07.123456
XX34 SA8 676868
YY13_SS3_798798
HJ88.657769
.898798

Ожидаемый результат:

ColA    ColB    ColC
---------------------
AA12    F07     123456
XX34    SA8     676868
YY13    SS3     798798
HJ88    NULL    657769
NULL    NULL    898798

В последней строке перед нет кода стоимости из 3 цифр В последней строке нет кода местоположения из 4 цифр

Можете ли вы пожалуйстаподскажите как этого добиться?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Исходя из ваших примеров, следующее должно дать вам желаемые результаты ...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NULL 
BEGIN   -- DROP TABLE #TestData;
    CREATE TABLE #TestData (
        ColumnA VARCHAR(17) NOT NULL 
        );

    INSERT #TestData(ColumnA) VALUES
        ('AA12.F07.123456'),
        ('XX34 SA8 676868'),
        ('YY13_SS3_798798'),
        ('HJ88.657769'),
        ('.898798');
END;

--SELECT * FROM #TestData td;

--==========================================

SELECT 
    td  .ColumnA,
    ca.ColA,
    cb.ColB,
    cc.Colc
FROM
    #TestData td
    CROSS APPLY ( VALUES (CASE WHEN td.ColumnA LIKE '[0-Z][0-Z][0-Z][0-Z][^0-Z]%' OR td.ColumnA LIKE '[0-Z][0-Z][0-Z][0-Z]' THEN SUBSTRING(td.ColumnA, 1, 4) END) ) ca (ColA)
    CROSS APPLY ( VALUES (CASE WHEN td.ColumnA LIKE '%[^0-Z][0-Z][0-Z][0-Z][^0-Z]%' THEN SUBSTRING(td.ColumnA, 6, 3) END) ) cb (ColB)
    CROSS APPLY ( VALUES (CASE WHEN td.ColumnA LIKE '%[0-Z][0-Z][0-Z][0-Z][0-Z][0-Z]' THEN RIGHT(td.ColumnA, 6) END) ) cc (Colc);

Результаты:

ColumnA           ColA ColB Colc
----------------- ---- ---- ------
AA12.F07.123456   AA12 F07  123456
XX34 SA8 676868   XX34 SA8  676868
YY13_SS3_798798   YY13 SS3  798798
HJ88.657769       HJ88 NULL 657769
.898798           NULL NULL 898798
0 голосов
/ 09 октября 2018

То, что написал Джейсон Лонг, это то, как я это сделаю.Основываясь на его ответе, я упростил это до одного ПРИМЕНЕНИЯ КРОССА, а не CASE:

SELECT t.ColumnA,
       colA = SUBSTRING(t.ColumnA, col.a, 4), 
       colB = SUBSTRING(t.ColumnA, col.b, 3),
       colC = SUBSTRING(t.ColumnA, col.c, 6)
FROM   #TestData AS t
CROSS APPLY (VALUES(
  NULLIF(PATINDEX('[A-Z][A-Z][0-9][0-9][^A-Z0-9]%', t.ColumnA),0),
  NULLIF(PATINDEX('%[^A-Z0-9][A-Z][A-Z0-9][A-Z0-9][^A-Z0-9]%', t.ColumnA),0)+1,
  NULLIF(PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]', t.ColumnA),0))) AS col(a,b,c);
0 голосов
/ 08 октября 2018

Просто используйте substring() и разумно используйте сопоставление с образцом:

select (case when a like '[^_. ][^_. ][^_. ][^_. ][_. ]%' then left(a, 4) 
        end) as col1,
       (case when a like  '[^_. ][^_. ][^_. ][^_. ][_. ][^_. ][^_. ][^_. ][^_. ][_. ]%' then substring(a, 6, 3) 
        end) as col2,
       (case when a like '[^_. ][^_. ][^_. ][^_. ][^_. ][^_. ]' then right(a, 6) end) as col3
...