DECLARE @ELEMENT1 VARCHAR(100)='REF*MK*37908-155-3**DO#0000000000#ZZ#202108161400PB3#ZZ#20210817BBBBBBB4';
我想要一個如下表所示的答案
| 身份 | 價值 |
|---|---|
| 1 | 參考 |
| 2 | MK |
| 3 | 37908-155-3 |
| 4 | |
| 5 | 做 |
| 6 | 0000000000 |
| 7 | Z Z |
| 8 | 202108161400PB3 |
| 9 | Z Z |
| 10 | 20210817BBBBBBB4 |
DECLARE @ELEMENT1 VARCHAR(100)='REF*MK*37908-155-3**DO#0000000000#ZZ#202108161400PB3#ZZ#20210817BBBBBBB4';
;WITH Identities AS(
SELECT [key] / 2 AS Entry,
MAX(CASE WHEN [key] % 2 = 0 THEN [Value] END) AS [Identity],
MAX(CASE WHEN [key] % 2 = 1 THEN [Value] END) AS [Value]
FROM OPENJSON(CONCAT('["',REPLACE(@ELEMENT1,'#', '","'),'"]')) OJ
GROUP BY [key] / 2)
SELECT TOP (2)
[Identity],
[Value]
FROM Identities
ORDER BY Entry ASC
uj5u.com熱心網友回復:
您需要替換所有分隔符,而不僅僅是其中一個。如果您有兩個以上的分隔符,因此我還演示了TRANSLATE此處的用法,因此將來需要滿足它們:
DECLARE @ELEMENT1 VARCHAR(100)='REF*MK*37908-155-3**DO#0000000000#ZZ#202108161400PB3#ZZ#20210817BBBBBBB4';
SELECT OJ.[Key] 1 AS [Identity], --Don't use reserved keywords as aliases/object names
[value]
FROM OPENJSON(CONCAT('["',REPLACE(TRANSLATE(@ELEMENT1,'#*','##'),'#', '","'),'"]')) OJ;
如果您使用的是 Azure SQL 資料庫(希望是SQL Server 2022 ),則可以使用STRING_SPLIT它的序數引數:
DECLARE @ELEMENT1 VARCHAR(100)='REF*MK*37908-155-3**DO#0000000000#ZZ#202108161400PB3#ZZ#20210817BBBBBBB4';
SELECT ordinal AS [Identity], --Don't use reserved keywords as aliases/object names
value
FROM STRING_SPLIT(TRANSLATE(@ELEMENT1,'#*','##'),'#',1) SS;
我不會在沒有序數引數的情況下使用它,因為據記載,STRING_SPLIT它不能保證回傳資料的順序。盡管我(和許多其他人)從未見過這樣的順序不被尊重,但它被明確記錄為不被尊重的事實,并且您必須依賴任意順序,可能會導致您無法控制的錯誤結果。幸運的是,經過 6 年的抱怨,微軟終于在函式中添加了引數。
uj5u.com熱心網友回復:
DECLARE @ELEMENT1 VARCHAR(100)
= 'REF*MK*37908-155-3**DO#0000000000#ZZ#202108161400PB3#ZZ#20210817BBBBBBB4';
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) Id
, d2.value
FROM STRING_SPLIT(@ELEMENT1 , '*') d1
CROSS APPLY STRING_SPLIT(d1.value , '#') d2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/456553.html
