我正在嘗試提取由特殊字符(如括號)包圍的某些字串值,并使用提取的字串值創建新列。例如,原始列看起來像這樣。
Column
Dec12 SKLEKF [[ABC]] <<JK>>
Jan13 KEJ [[FJ]] <<UHJ>>
FEB12 JKEJSKEJG [[GBC]] <<JUIDJ>>
我正在嘗試使用括號內的字串值創建兩個新列。新資料表應如下所示。
Code ID
ABC JK
FJ UHJ
GBC JUIDJ
我嘗試了以下代碼,但它不起作用,因為括號之前和括號內的字串值的長度因行而異。有沒有辦法決議括號括起來的字串值而不管它們的長度?
select SUBSTRING(Column, 13, 3) AS Code
from table
謝謝你。
uj5u.com熱心網友回復:
使用SUBSTRING操作:
SELECT
col,
SUBSTRING(col, CHARINDEX('[[', col) 2,
CHARINDEX(']]', col) - CHARINDEX('[[', col) - 2) AS Code,
SUBSTRING(col, CHARINDEX('<<', col) 2,
CHARINDEX('>>', col) - CHARINDEX('<<', col) - 2) AS ID
FROM yourTable;
uj5u.com熱心網友回復:
另一種方法是使用 XML 和 XQuery。
這個想法是對一串標記進行標記,并根據它們的位置獲取單個標記:[last()]和[last()-1]。
查詢陳述句
-- DDL and sample data population, start
DECLARE @tbl TABLE (seq INT identity PRIMARY KEY, tokens VARCHAR(100));
INSERT INTO @tbl (tokens) VALUES
('Dec12 SKLEKF [[ABC]] <<JK>>'),
('Jan13 KEJ [[FJ]] <<UHJ>>'),
('FEB12 JKEJSKEJG [[GBC]] <<JUIDJ>>');
-- DDL and sample data population, end
SELECT t.*
, TRIM('[]' FROM c.value('(/root/r[last()-1]/text())[1]', 'VARCHAR(20)')) AS Code
, TRIM('<>' FROM c.value('(/root/r[last()]/text())[1]', 'VARCHAR(20)')) AS ID
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA['
REPLACE(tokens, SPACE(1), ']]></r><r><![CDATA[')
']]></r></root>' AS XML)) AS t1(c);
輸出
----- ----------------------------------- ------ -------
| seq | tokens | Code | ID |
----- ----------------------------------- ------ -------
| 1 | Dec12 SKLEKF [[ABC]] <<JK>> | ABC | JK |
| 2 | Jan13 KEJ [[FJ]] <<UHJ>> | FJ | UHJ |
| 3 | FEB12 JKEJSKEJG [[GBC]] <<JUIDJ>> | GBC | JUIDJ |
----- ----------------------------------- ------ -------
uj5u.com熱心網友回復:
還有一個建議:
SELECT A.casted.value('(/x/@code)[1]','nvarchar(100)') AS Code
,A.casted.value('(/x/@id)[1]','nvarchar(100)') AS I
,A.casted
FROM YourTable t
CROSS APPLY(VALUES(CAST(REPLACE(REPLACE(REPLACE(REPLACE(t.tokens,'[[','<x code="')
,']]','"/>')
,'<<','<x id="')
,'>>','"/>') AS xml))) A(casted)
簡而言之的想法:
- 當您使用不同的“標記”字符時,我們可以輕松地將您的字串轉換為有效的 XML,并進行一些替換
結果Dec12 SKLEKF <x code="ABC" /><x id="JK" /> - 現在可以很容易地
.value()直接從 XML 中獲取屬性的值。
更新
如果您的代碼可能包含 XML 中禁止使用的字符,您可以改用它APPLY:
CROSS APPLY(VALUES(CAST(REPLACE(REPLACE(REPLACE(REPLACE((SELECT t.tokens AS [*] FOR XML PATH(''))
,'[[','<x code="')
,']]','"/>')
,'<<','<x id="')
,'>>','"/>') AS xml))) A(casted);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/381362.html
標籤:sql sql-server 查询语句
