2012-01-23 26 views
11

在MS SQL中,我需要一種方法來確定特定小數列的行使用的最大比例。確定在列上使用的最大小數位數

例如Col1 Decimal(19,8)的刻度爲8,但我需要知道是否所有8實際上正在使用,或者如果只使用5,6或7。

樣本數據:

123.12345000 
321.000 
5255.12340000 
5244.12345000 

對於上述數據,我需要查詢要麼返回5,或123.12345000或5244.12345000。

我不關心性能,我敢肯定全表掃描將按順序,我只需要運行一次查詢。

回答

9

不漂亮,但我認爲它應該做的伎倆:

-- Find the first non-zero character in the reversed string... 
-- And then subtract from the scale of the decimal + 1. 
SELECT 9 - PATINDEX('%[1-9]%', REVERSE(Col1)) 
+0

不漂亮,但輝煌。奇蹟般有效。剛剛添加了MAX(),並過濾掉了0.00000000。添加MAX()給了我:SELECT MAX(9 - PATINDEX('%[1-9]%',REVERSE(Col1))) –

6

我喜歡@Michael Fredrickson's answer更好,我只是張貼這作爲特殊情況下的替代,其中實際規模不得而知,但可以肯定的是沒有超過18:

SELECT LEN(CAST(CAST(REVERSE(Col1) AS float) AS bigint)) 

請注意,雖然有兩個顯式調用科協這裏,查詢實際執行兩個隱式轉換:

  1. 作爲REVERSE的參數,Col1被轉換爲字符串。

  2. bigint在被用作LEN的參數之前被轉換爲字符串。

+0

+1對於不需要知道比例... –

+0

您幫助找到解決方案這一個:http://stackoverflow.com/a/14715318/114029我不得不走得更遠,並使用這傢伙的帖子去那裏:http://connectsql.blogspot.com.br/2011/04/normal-0 -microsoftinternetexplorer4.html有趣的是,人們如何在這裏和那裏分散的信息構建解決方案:D –

0

注意這將掃描整個表:

SELECT TOP 1 [Col1] 
FROM [Table] 
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC