我想將數字轉換爲字符「。」之間每個數字的小數點後3位。例如:T-SQLpad在字符串中爲「。」之間的值前導零。字符
1.1.5.2 -> 001.001.005.002
1.2 -> 001.002
4.0 -> 004.000
4.3 ->004.003
4.10 -> 004.010
這是我的查詢:
SELECT ItemNo
FROM EstAsmTemp
我想將數字轉換爲字符「。」之間每個數字的小數點後3位。例如:T-SQLpad在字符串中爲「。」之間的值前導零。字符
1.1.5.2 -> 001.001.005.002
1.2 -> 001.002
4.0 -> 004.000
4.3 ->004.003
4.10 -> 004.010
這是我的查詢:
SELECT ItemNo
FROM EstAsmTemp
您沒有提及'。'的數量。分隔欄可以有。我假設,最大值是4,解決方案在下面。
SELECT STUFF(ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,4),4),'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,3),4) ,'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,2),4) ,'') + ISNULL('.' + RIGHT('000' + PARSENAME(STRVALUE,1),4),''),1,1,'') FROM (VALUES('1.1.5.2'), ('1.2'), ('4.0'),('4.3'), ('4.10')) A (STRVALUE)
這是相當容易的,一旦你瞭解所有的步驟:
理想情況下,您不應該將數據與多個數據點存儲在一個像這樣的交叉點,但有時您只是別無選擇。
我正在使用Jeff Moden的字符串拆分器和Sql Server Central中的社區,可以在這裏找到它。 http://www.sqlservercentral.com/articles/Tally+Table/72993/。那裏還有很多其他像樣的字符串分隔符。以下是其他選項的一些很好的例子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings。
在生產系統中使用它之前,請確保您瞭解此代碼,因爲它會讓您在凌晨3點打電話要求將其修復。
with something(SomeValue) as
(
select '1.1.5.2' union all
select '1.2' union all
select '4.0' union all
select '4.3' union all
select '4.10'
)
, parsedValues as
(
select SomeValue
, right('000' + CAST(x.Item as varchar(3)), 3) as NewValue
, x.ItemNumber as SortOrder
from something s
cross apply dbo.DelimitedSplit8K(SomeValue, '.') x
)
select SomeValue
, STUFF((Select '.' + NewValue
from parsedValues pv2
where pv2.SomeValue = pv.SomeValue
order by pv2.SortOrder
FOR XML PATH('')), 1, 1, '') as Details
from parsedValues pv
group by pv.SomeValue
我決定根據Zohar Peled的評論在表示層中更改它。
4.0124 - >要什麼? – Praveen
三個字符是字符之間每個值的最大值。 – maverick1975
Yuck。爲什麼要在一個單獨的區段中存儲多個分隔值?這違反了1NF並導致了山脈的痛苦。您必須首先將其解析爲每個元素,然後將每個數據點轉換爲您想要的,並最終再次將它們推回到單個列中。這只是存儲數據的錯誤方法。 –