SQL подзапрос с разделителем - PullRequest
0 голосов
/ 17 октября 2019

Мне нужно иметь возможность разделить одну строку разделителем * на отдельные столбцы без включения * Столбец y из таблицы x выглядит следующим образом:

column y
*1HS*AB*GXX*123*02*PA45*2013-08-10*
*1R1*B*GX*123*02*PA45*2013-08-10*
*1HS*B*GX*13*01*PA45*2013-08-01*
*1P*C*GXX*123*02*PA45*2013-08-10*

STRING_SPLIT недоступен

Результат должен быть таким:

Column1 Column2 Column3 Column4 Column5 Column6 Column7
1HS     AB      GXX     123     2       PA45    10-08-2013
1R1     B       GX      123     2       PA45    10-08-2013
1HS     B       GX      13      1       PA45    01-08-2013
1P      C       GXX     123     2       PA45    10-08-2013

Ответы [ 3 ]

1 голос
/ 17 октября 2019

вы будете использовать приведенный ниже запрос ..

select RTRIM (REGEXP_SUBSTR (column y, '[^,]*,', 1, 1), ',')    AS column 1
    ,       RTRIM (REGEXP_SUBSTR (column y, '[^,]*,', 1, 2), ',')    AS column 2
    ,       RTRIM (REGEXP_SUBSTR (column y, '[^,]*,', 1, 3), ',')    AS column 3
    ,       LTRIM (REGEXP_SUBSTR (column y, ',[^,]*', 1, 3), ',')    AS column 4
    from YOUR_TABLE
0 голосов
/ 17 октября 2019

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

Подробности здесь

0 голосов
/ 17 октября 2019

К сожалению, string_split() не гарантирует сохранение порядка значений. И SQL Server не предлагает других полезных строковых функций.

Итак, я рекомендую использовать для этой цели рекурсивные CTE:

with t as (
      select *
      from (values ('*1HS*AB*GXX*123*02*PA45*2013-08-10*'), ('1HSB*GX*13*01*PA45*2013-08-01*')) v(str)
     ),
     cte as (
      select convert(varchar(max), null) as val, 0 as lev, convert(varchar(max), str) as rest,
             row_number() over (order by (select null)) as id
      from t
      union all
      select left(rest, charindex('*', rest) - 1), lev + 1, stuff(rest, 1, charindex('*', rest) + 1, ''), id
      from cte
      where rest <> '' and lev < 10
     )
select max(case when lev = 1 then val end) as col1,
       max(case when lev = 2 then val end) as col2,
       max(case when lev = 3 then val end) as col3,
       max(case when lev = 4 then val end) as col4,
       max(case when lev = 5 then val end) as col5,
       max(case when lev = 6 then val end) as col6,
       max(case when lev = 7 then val end) as col7
from cte
where lev > 0
group by cte.id;

Здесь - это дБ <>скрипка.

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