iT邦幫忙

2

MSSQL 如何拆出數字文字

  • 分享至 

  • xImage

您好:
如下資料,需要拆出 最後一個* 號的數量

培林5205ZZ8只
油封DKB-30
477/108片
破布A*40KG
內外牙彎頭 90。(銅 P-079) 1/4"*6.00個

培林5205ZZ8只 ==> 8只 ==>最後需要數量 8
破布A
40KG ==>40KG ==>最後需要數量 40
內外牙彎頭 90。(銅 P-079) 1/4"*6.00個 ==>6.00個 ==>最後需要數量 6.00 或6

目前找網路上的資料,可以找到 「油封DKB-30477/10*」但 8片
請問,有辦法英數字分拆 嗎?
還是有其他方式可以處理 謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
純真的人
iT邦大師 1 級 ‧ 2023-12-01 08:25:26
最佳解答

try~

declare @a table(
	Txt nvarchar(100)
)
insert into @a
values(N'培林5205ZZ8只')
,(N'油封DKB-30477/108片')
,(N'破布A*40KG')
,(N'內外牙彎頭 90。(銅 P-079) 1/4"*6.00個')

select *
,left(
	right(
		txt
		,PATINDEX ('%[0-9]%',REVERSE(txt))
		+ PATINDEX ('%[^0-9.]%',right(REVERSE(txt),len(txt)-(PATINDEX ('%[0-9]%',REVERSE(txt))-1)))
		-2
	)
	,
	PATINDEX ('%[^0-9.]%',right(REVERSE(txt),len(txt)-(PATINDEX ('%[0-9]%',REVERSE(txt))-1))) -1
)
Unit
from @a

https://dbfiddle.uk/ozc-Kz_v

題外話..這是抓不規則吧@@a

noway iT邦研究生 1 級 ‧ 2023-12-01 08:38:04 檢舉

您好:
謝謝您, 是抓不規則資料
我最後是有用 寫func 跑回圈去找出 非 (isnumer 和 '.' )的位置來回傳數字

rain_yu iT邦研究生 5 級 ‧ 2023-12-01 08:41:04 檢舉

還真有好心人願意解決,受小第一拜

剛剛檢查SQL有抓非數字判斷錯誤^^"..
我再修正SQL了一下~

1
k03216580
iT邦新手 5 級 ‧ 2023-11-30 17:55:54

首先,是我的話會先去扁開這table的人

另外我看不太懂問題
不知道是我理解能力太差還是怎樣

您說要拆出最後一個*號後的數字
但以下兩筆資料都沒有*號
培林5205ZZ8只
油封DKB-30477/108片

最後這段更看不懂:
「油封DKB-30477/10*」但 8片
這是甚麼鬼

需求不夠明確,我只能看您中間的示例來通靈
我猜是想要取得最後一組出現的數字
如果用拆分的方式
我會把資料取出來後用其他程式語言
找出最後一個數字出現的位置,往前遍歷直到出現非數字
最後再輸出就可以了,但我猜效能會炸開

通常應該都是把table schema改成
itemName 培林
itemCode 5205ZZ
amount  8
unit    只
這樣後續要做其他功能
如查詢Name、Code或是增減數量都方便
不然你code寫到吐就算了,倉儲類的資料通常又不少
效能真的會炸開

2
alien663
iT邦研究生 4 級 ‧ 2023-12-01 09:08:37

這樣?
我的想法跟純真的人一樣,透過正則表示法取資料,只是我透過變數宣告把一行select拆開來。

create function fn_splitFinalNum(@tt nvarchar(125))
returns decimal(10,4)
as begin
	declare @rt nvarchar(32) = reverse(@tt)
	declare @rt2 nvarchar(32) = SUBSTRING(@rt, PATINDEX('%[0-9.]%', @rt), len(@rt))
	return convert(decimal(10, 4), REVERSE(SUBSTRING(@rt2, 0, PATINDEX('%[^0-9.]%', @rt2))))
end
go

declare @a table(
	Txt nvarchar(100)
)
insert into @a
values(N'培林5205ZZ8只')
,(N'油封DKB-30477/108片')
,(N'破布A*40KG')
,(N'內外牙彎頭 90。(銅 P-079) 1/4"*6.00個')

select dbo.fn_splitFinalNum(Txt) from @a

我要發表回答

立即登入回答