2012-01-23 22 views
11

Trong MS SQL, tôi cần một cách tiếp cận để xác định quy mô lớn nhất đang được sử dụng bởi các hàng cho một cột thập phân nhất định.Xác định quy mô thập phân tối đa được sử dụng trên một cột

Ví dụ Col1 Decimal (19,8) có thang điểm 8, nhưng tôi cần phải biết tất cả 8 thực sự đang được sử dụng hay chỉ sử dụng 5, 6 hoặc 7.

mẫu dữ liệu:

123.12345000 
321.000 
5255.12340000 
5244.12345000 

Đối với các dữ liệu trên, tôi sẽ cần truy vấn cho một trong hai trở lại 5, hoặc 123,12345000 hoặc 5244,12345000.

Tôi không quan tâm đến hiệu suất, tôi chắc chắn quét toàn bộ bảng sẽ theo thứ tự, tôi chỉ cần chạy truy vấn một lần.

Trả lời

9

Không đẹp, nhưng tôi nghĩ rằng nó sẽ làm các trick:

-- 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

Không đẹp, nhưng Brilliant. Làm việc như một say mê. Chỉ cần thêm MAX() và lọc ra 0,00000000. Thêm MAX() đã cho tôi: SELECT MAX (9 - PATINDEX ('% [1-9]%', REVERSE (Col1))) –

6

Tôi thích @Michael Fredrickson's answer tốt hơn và đang chỉ gửi bài này như một sự thay thế cho trường hợp cụ thể mà quy mô thực tế là chưa biết nhưng chắc chắn là không có hơn 18:

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

Xin lưu ý rằng, mặc dù có hai CAST rõ ràng gọi đây, truy vấn thực sự thực hiện hai chuyển đổi ngầm hơn:

  1. Là đối số của REVERSE, Col1 được chuyển thành chuỗi.

  2. bigint được truyền dưới dạng chuỗi trước khi được sử dụng làm đối số của LEN.

+0

+1 Vì không cần biết quy mô ... –

+0

Bạn đã giúp tìm giải pháp này: http://stackoverflow.com/a/14715318/114029 Tôi đã phải đi xa hơn và sử dụng bài đăng của anh chàng này để đạt được điều đó: http://connectsql.blogspot.com.br/2011/04/normal-0 -microsoftinternetexplorer4.html Thật thú vị khi một người được xây dựng giải pháp dựa trên các thông tin rải rác ở đây và ở đó ...: D –

0
SELECT 
    MAX(CHAR_LENGTH(
     SUBSTRING(column_name::text FROM '\.(\d*?)0*$') 
    )) AS max_scale 
FROM table_name; 

*? là phiên bản không tham lam của *, vì vậy \d*? bắt tất cả các chữ số sau dấu thập phân trừ số không đuôi.

Mẫu có chứa một cặp dấu ngoặc đơn, do đó phần của văn bản khớp với biểu thức con được nén đầu tiên (nghĩa là \d*?) được trả lại.

Tài liệu tham khảo:

0

Chú giải này sẽ quét toàn bộ bảng:

SELECT TOP 1 [Col1] 
FROM [Table] 
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC 
Các vấn đề liên quan