請考慮下表。我正在嘗試僅檢索Tax字串中的 EUR 金額。有些記錄在大小上比其他記錄變化更大,但浮點數總是存在的。
OrderID SKU Price Tax
**** **** **** [<TV<standard#21.0#false#21.36#EUR>VT>]
**** **** **** [<TV<standard#21.0#false#7.21#EUR>VT>]
**** **** **** [<TV<standard#17.0#false#5.17#EUR>VT>]
我寫了一個符合我需要的正則運算式:\d \W\d 回傳字串中的兩個浮點值。在 Oracle SQL 中,我可以簡單地使用如下查詢獲得第二次出現:
SELECT REGEXP_SUBSTR(column, '\d \W\d ',1,2) FROM table
使用上述方法,我檢索21.36,7.21以及5.17這三個記錄。
如何使用 SQL Server 實作這一點?
uj5u.com熱心網友回復:
顯然,正則運算式將是這里可能的首選工具。但是 SQL Server 沒有太多的原生正則運算式支持。這是一個使用PATINDEX和的純 SQL Server 解決方案CHARINDEX。它有點冗長,但可以完成作業:
SELECT
SUBSTRING(Tax,
CHARINDEX('#', Tax, PATINDEX('%[0-9]#%', Tax) 3) 1,
CHARINDEX('#', Tax, CHARINDEX('#', Tax, PATINDEX('%[0-9]#%', Tax) 3) 1) -
CHARINDEX('#', Tax, PATINDEX('%[0-9]#%', Tax) 3) - 1)
FROM yourTable;

演示
uj5u.com熱心網友回復:
請嘗試以下解決方案。
該方法是使用 XML 對稅列進行標記化。它為每一行生成如下的 XML:
<root>
<r>[<TV<standard</r>
<r>21.0</r>
<r>false</r>
<r>21.36</r>
<r>EUR>VT>]</r>
</root>
第 4 個 r 元素是所討論的貨幣價值。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Tax VARCHAR(MAX));
INSERT INTO @tbl (Tax) VALUES
('[<TV<standard#21.0#false#21.36#EUR>VT>]'),
('[<TV<standard#21.0#false#7.21#EUR>VT>]'),
('[<TV<standard#17.0#false#5.17#EUR>VT>]');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = '#';
SELECT t.*
, c.value('(/root/r[4]/text())[1]', 'DECIMAL(10,2)') AS result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA['
REPLACE(tax, @separator, ']]></r><r><![CDATA[')
']]></r></root>' AS XML)) AS t1(c);
輸出
---- ----------------------------------------- --------
| ID | Tax | result |
---- ----------------------------------------- --------
| 1 | [<TV<standard#21.0#false#21.36#EUR>VT>] | 21.36 |
| 2 | [<TV<standard#21.0#false#7.21#EUR>VT>] | 7.21 |
| 3 | [<TV<standard#17.0#false#5.17#EUR>VT>] | 5.17 |
---- ----------------------------------------- --------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311523.html
標籤:sql sql-server 查询语句 索引
上一篇:如何從列中選擇拆分字串
