2010-03-10 62 views
7

Tôi có một cột VARCHAR (100) trong một bảng có chứa kết hợp các số nguyên (dưới dạng chuỗi) và các chuỗi không phải số nguyên. Ví dụ.SQL Server 2005 Chuyển đổi VARCHAR thành INT nhưng mặc định trên loại không hợp lệ

| dimension varchar(100) | 
| '5'     | 
| '17'     | 
| '3'     | 
| 'Pyramids'    | 
| 'Western Bypass'  | 
| '15'     | 

Làm cách nào để viết biểu thức, ví dụ: tổng hợp tất cả các giá trị là số nguyên hợp lệ? Nếu tôi cố gắng:

-- should return 5 + 17 + 3 + 15 = 40 
SELECT 
    SUM(CONVERT(INT, dimension)) 
FROM 
    mytable 

Tôi sẽ nhận được lỗi Conversion failed when converting the varchar value 'Pyramids' to data type int..

Có thử nghiệm nào tôi có thể sử dụng trong biểu thức của mình, giống như hàm ISNULL(), cho phép tôi chỉ định giá trị mặc định nếu trường không phải là số không?

Trả lời

20

Hãy thử điều này:

SELECT 
    SUM(CASE ISNUMERIC(dimension) 
      WHEN 1 THEN CONVERT(INT, dimension) 
      ELSE 0 
     END) 
FROM 
    mytable 

Các trường hợp cần kiểm tra xem dimension là số - nếu như vậy, trở về giá trị đó. Nếu nó không phải là số, hãy trả lại giá trị mặc định (ở đây: 0)

Bạn có cần truy vấn thường xuyên không, bạn cũng có thể thêm cột được tính toán, tiếp tục vào bảng của bạn để gói gọn tính toán này và lưu trữ giá trị. Bằng cách này, khi tổng hợp và như vậy, bạn không luôn luôn tái tính toán giá trị:

ALTER TABLE mytable 
    ADD NumericValue AS CASE ISNUMERIC(dimension) 
     WHEN 1 THEN CONVERT(INT, dimension) ELSE 0 END PERSISTED 

Bây giờ, bạn có thể SELECT dimension, numericvalue FROM mytable và nhận được cả hai giá trị mà không cần bất kỳ tính toán phải được thực thi.

+0

Perfect! Cảm ơn bạn! 'ISNUMERIC ('- 1.44')' và 'ISNUMERIC ('12')' trả về 1 trong khi 'ISNUMERIC ('foobar')' return 0. Chỉ cần những gì tôi cần. –

1

Bạn sẽ chạy vào các vấn đề tràn nếu bạn có một varchar như 88888888888888888888888

select 
SUM(
    CASE 
     WHEN ISNUMERIC(CheckCol+ '.0e0') = 1 AND 
     convert(decimal(38,0), CheckCol) 
     BETWEEN -2147483648 AND 2147483647 
    THEN 1 
    ELSE 0 
    END 
) 
from Table 
Các vấn đề liên quan