2010-01-21 27 views

Trả lời

15

Chức năng IsNumeric trả về cho dù một chuỗi là số, nhưng sẽ trở thành sự thật cho những người không-nguyên.

Vì vậy, bạn có thể sử dụng:

WHERE ISNUMERIC(str) AND str NOT LIKE '%.%' AND str NOT LIKE '%e%' AND str NOT LIKE '%-%' 
+3

Và những gì được với chuỗi như ' '£ ''hoặc'' 0d0''? 'ISNUMERIC' vẫn sẽ trả về' 1'. –

+0

Tôi cho rằng việc loại trừ ký tự theo ký tự không giúp ích gì vì chúng tôi có thể có nhiều kết hợp. ví dụ: ký tự đặc biệt, bảng chữ cái, v.v. – Dev

2

Xem this:

CREATE Function dbo.IsInteger(@Value VarChar(18)) 
Returns Bit 
As 
Begin 

    Return IsNull(
(Select Case When CharIndex('.', @Value) > 0 
       Then Case When Convert(int, ParseName(@Value, 1)) <> 0 
         Then 0 
         Else 1 
         End 
       Else 1 
       End 
     Where IsNumeric(@Value + 'e0') = 1), 0) 

End 
-1

Standart chức năng T-SQL IsNumeric (expression) Xác định xem một biểu thức là một loại số hợp lệ.

+0

Thực sự là kiểu số hợp lệ, mặc dù nó không quan tâm về số nguyên, số thập phân, tiền hoặc nổi. Và OP đã hỏi một cách rõ ràng về số nguyên. – Joey

5

Bạn có thể sử dụng toán tử NHƯ:

+1

Sử dụng 'LTRIM (RTRIM (str)) KHÔNG THÍCH '% [^ 0-9]%'' để cho phép khoảng trắng xung quanh các số. – sparebytes

1

Nó là một chút khó khăn để đảm bảo rằng một giá trị sẽ phù hợp với một số nguyên 4 byte.

Vì bạn đang sử dụng 2005 - Một cách là cố gắng chuyển đổi giá trị trong một khối try/catch. Đó sẽ là cách tốt nhất để đảm bảo rằng nó thực sự là một int. Tất nhiên bạn cần phải xử lý các trường hợp khi nó không có trong khối catch theo yêu cầu của bạn.

Một cách khác để chỉ kiểm tra chỉ "chữ số" là thế này:

nơi strVal không thích '% [^ 0-9]%'

Đó sẽ bỏ lỡ -25. cũng như cho phép '99999999999999999999' Vì vậy, bạn có thể cần bao gồm tiêu chí bổ sung với phương pháp này.

15

Mặc dù áp phích ban đầu đã đề cập đến SQL 2005, tôi thấy trong năm 2008 r2 một số where isnumeric(string) thẳng dẫn đến lỗi 4145 không kiểu boolean. Để giải quyết sử dụng này: where isnumeric(string) = 1

0

sử dụng ~ (CAST (PATINDEX ('% [^ 0-9]%', giá trị) như BIT)) xử lý tất cả các nhân vật

Các vấn đề liên quan