Всегда стоит упомянуть, что в любом случае следует избегать разделенных данных.Это нарушение 1.NF и реальная боль в шее в запросах.Если есть возможность изменить эту проблему на стороне ввода, сначала следует сделать это.
Поскольку вы используете STRING_SPLIT()
, вы должны быть на версии v2016 +.
Намного лучше, чем этот странный STRING_SPLIT()
, который не возвращает позицию фрагмента , а не гарантирует возврата в ожидаемом порядке , это трюк с JSON:
DECLARE @SomeDelimitedString VARCHAR(100)='part1|part2|part3';
DECLARE @JsonArray NVARCHAR(MAX)=CONCAT('["',REPLACE(@SomeDelimitedString,'|','","'),'"]');
SELECT @SomeDelimitedString AS TheOriginal
,@JsonArray AS TransformedToJSON
,JSON_VALUE(@JsonArray,'$[0]') AS TheFirstFragment
,JSON_VALUE(@JsonArray,'$[1]') AS TheSecondFragment
,JSON_VALUE(@JsonArray,'$[2]') AS TheThirdFragment
Результат
part1|part2|part3 ["part1","part2","part3"] part1 part2 part3
Идея вкратце:
Мы используем несколько простых строковых операций для преобразования строки с разделителями в JSON-массив.Теперь мы можем использовать JsonPath для захвата фрагмента по его позиции.
Вы можете прочитать этот ответ для получения более подробной информации (раздел ОБНОВЛЕНИЕ для v2016 + и раздел ОБНОВЛЕНИЕ 2 для безопасных результатов).
Я не могу проверить это, ноВы можете попробовать что-нибудь по этому поводу:
SELECT
m.ACCTID
,m.ITEMDESC
,m.GLACCTNBR
,m.TOTAL
,m.DEPFILENBR
,m.DEPFILESEQ
,m.ITEMACCTID
,m.AMOUNT
,JSON_VALUE(JsonArray,'$[0]') AS PLUDEP
,JSON_VALUE(JsonArray,'$[1]') AS FUND
,JSON_VALUE(JsonArray,'$[2]') AS REVCD
,JSON_VALUE(JsonArray,'$[3]') AS SUBREVCD
,JSON_VALUE(JsonArray,'$[4]') AS BALSJT
FROM TG_ITEM_DATA m
inner join TG_TRAN_DATA t on m.DEPFILENBR = t.DEPFILENBR
AND m.DEPFILESEQ = t.DEPFILESEQ
AND m.EVENTNBR = t.EVENTNBR
AND m.TRANNBR = t.TRANNBR
AND t.VOIDDT IS NULL
AND NOT(t.ITEMIND='T')
AND m.GLACCTNBR IS NOT NULL
CROSS APPLY (SELECT CONCAT('["',REPLACE(m.GLACCTNBR,'|','","'),'"]')) BK(JsonArray)
WHERE m.DEPFILENBR=2019261
AND m.DEPFILESEQ=1
AND m.ACCTID IS NOT NULL
--GROUP BY m.DEPFILENBR,m.depfileseq,m.acctid,m.GLACCTNBR,m.ITEMACCTID,m.AMOUNT,PLUDEP,FUND,REVCD,SUBREVCD,BALSJT