Выбрать элемент в списке строк в SQL на основе значения в столбце - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица SQL со столбцом (Grouped_Identifer) со списком строк. Элементы в списке разделены запятыми. Есть еще один столбец (Позиция), в котором есть значение. Я хотел бы создать или вернуть столбец, назовем его Position_Identifer, который имеет часть или элемент в Grouped_Identifer, который соответствует значению в столбце Position.

Итак, мы начнем со следующей таблицы:

enter image description here

And would like to end up with a table that looks like the following:

введите описание изображения здесь

Список строк в столбце Grouped_Identifier может варьироваться по количеству (до 20) элементов.

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

вы можете достичь этого с помощью string_split, если ваша версия sql поддерживает это следующим образом

with data
  as (select '008300000;#61,008300000;#62,008300000;#63' as gi,'1' as pos union all
      select '008300000;#61,008300000;#62,008300000;#63' as gi,'2' as pos union all
      select '008300000;#61,008300000;#62,008300000;#63' as gi,'3' as pos 
     )
   ,cte_d
   as(
select *
       ,row_number() over(partition by pos order by pos) as rn
  from data d
cross apply string_split(d.gi,',') x
     )
select * 
  from cte_d
where rn=pos

В более старых версиях вы можете использовать эту

with data
  as (select '008300000;#61,008300000;#62,008300000;#63' as gi,'1' as pos union all
      select '008300000;#61,008300000;#62,008300000;#63' as gi,'2' as pos union all
      select '008300000;#61,008300000;#62,008300000;#63' as gi,'3' as pos 
     )
    ,cte_d
    as(
SELECT a.gi
      ,a.pos
      ,split.a.value('.', 'VARCHAR(100)') AS split_val  
      ,row_number() over(partition by pos order by pos) as rn
 FROM (SELECT pos
             ,CAST ('<M>' + REPLACE(gi, ',', '</M><M>') + '</M>' AS XML) AS col
             ,gi
         FROM data 
       ) a 
 CROSS APPLY col.nodes ('/M') AS split(a)
      )
select *
  from cte_d
 where rn=pos


+-------------------------------------------+-----+---------------+----+
|                    gi                     | pos |     value     | rn |
+-------------------------------------------+-----+---------------+----+
| 008300000;#61,008300000;#62,008300000;#63 |   1 | 008300000;#61 |  1 |
| 008300000;#61,008300000;#62,008300000;#63 |   2 | 008300000;#62 |  2 |
| 008300000;#61,008300000;#62,008300000;#63 |   3 | 008300000;#63 |  3 |
+-------------------------------------------+-----+---------------+----+

ссылку dbfiddle https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1f753ad7c97255351efc704ebdd966c3

0 голосов
/ 04 августа 2020

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

Если строка не имеет дубликатов, вы можете использовать charindex(), чтобы найти позицию:

select t.*, s.value
from t outer apply
     (select *
      from (select s.value,
                   row_number() over (order by charindex(',' + s.value + ',', ',' + t.gi + ',')) as seqnum
            from string_split(t.gi, ',') s
           ) s
      where seqnum = t.pos
     ) s;

Здесь - скрипка db <>.

0 голосов
/ 04 августа 2020

Новый столбец можно рассчитать с помощью:

select substring(Grouped_Identifier,Position*15-14,14) as Position_Identifier from yourTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...