前幾天,遇到一個十分棘手的問題,有同事提出在是字符類型的列中進行起止號計算,大體是這樣的
新起號=上一條止號+1
新止號=新起號+數量
而在這一列的數據是這樣的
庫存
CN003?005007
000890670000
98111100 庫存
370111900000
001,800,900,00
~~~~~~~~~~~~
木辦法,問度娘吧,發現還是高人多啊,提出用ISNUMERIC(列名)=1,就是數字類型的,但是請看一下ISNUMERIC的說明文檔
ISNUMERIC
語法 ISNUMERIC ( expression )
參數 expression 要計算的表達式。
返回類型 int
備注 當輸入表達式的計算結果為有效的 numeric 數據類型時,ISNUMERIC 返回 1;否則返回 0。有效的 numeric 數據類型包括以下類型:int,numeric,bigint,money,smallint,smallmoney,
tinyint,float,decimal,real
注意: 對於不是數字的字符(如加號 (+)、減號 (-))和有效貨幣符號(如美元符號 ($))字符,ISNUMERIC 將返回 1。返回值為 1 確保可以將 expression 轉換為上述數字類型中的一種。但是此函數存在Bug,當判斷的表達式是字符類型的表達式時,就亂了!'001,800,900'同樣會認為是數字類型
可以替代的寫法是
PATINDEX('%[^0-9]%', 列名)
如果返回值等於0,則是純數字型(沒有0~9之外的字符)。
case when PATINDEX('%[^0-9]%', 列名)=0 then cast (列名 as decimal(18,0))+cast(1 as decimal(18,0)) else ~~~ end as 起號