2012-02-15 23 views
7

tôi đã tự hỏi làm thế nào để sử dụng IsNumeric trong SQL, đó là một chút khác biệt so với VBScript, nhưng tôi nghĩ rằng tôi đã có thể để có được xung quanh nó, ví dụ:Sử dụng NẾU IsNumeric như Argument

IF 1 = ISNUMERIC('5675754674') 
BEGIN 
... 
END 

có này là một cách xung quanh nó? Những gì tôi thực sự muốn làm là:

IF ISNUMERIC('5675754674') 
BEGIN 
... 
END 

nhưng có lỗi. Ví dụ 1 dường như hoạt động, nhưng chỉ cần đảm bảo tôi đang làm đúng, không thể tìm thấy bất kỳ tài nguyên trực tuyến nào tốt về nó.

Trả lời

14

Không có boolean trong SQL Server. Điều này có nghĩa là bạn không thể chỉ nói IF (expression); bạn phải so sánh nó với một cái gì đó, bởi vì nó trả về true hoặc false theo nghĩa tương tự như bạn có thể đã quen với các ngôn ngữ khác.

Chỉ cần một sở thích, nhưng tôi muốn viết nó theo cách này:

IF ISNUMERIC('5675754674') = 1 
BEGIN 
... 
END 

Không có cách nào trong SQL Server để tránh sự so sánh là 1, như trong ví dụ thứ hai của bạn.

Cũng như một sang một bên bạn nên lưu ý những điểm yếu của ISNUMERIC() - nó có thể cung cấp cho dương tính giả cho các giá trị "số" như ., CHAR(9), e, $ và một loạt các chuỗi không phải số khác. Nếu bạn muốn biết nếu có điều gì là một số nguyên, ví dụ, tốt hơn nên nói:

IF '5675754674' NOT LIKE '%[^0-9]%' 
BEGIN 
... 
END 

Nhưng ngay cả khi đó không phải là một thử nghiệm đầy đủ và hợp lệ vì nó sẽ trở lại đúng với giá trị > (2^32)-1 và nó sẽ trả về false cho tiêu cực giá trị.

Một nhược điểm để ISNUMERIC() là nó sẽ trả về true nếu giá trị có thể được chuyển đổi sang bất kỳ các loại số, mà không phải là giống như tất cả loại số. Thông thường, mọi người kiểm tra ISNUMERIC() và sau đó cố gắng truyền FLOAT đến SMALLINT và chuyển đổi không thành công.

Trong SQL Server 2012, bạn sẽ có phương thức mới gọi là TRY_CONVERT() trả về NULL nếu chuyển đổi sang loại dữ liệu được chỉ định không hợp lệ.

5

Bạn nói đúng, ISNUMERIC() trả về một int. Bạn có thể kiểm tra tài liệu: ISNUMERIC()

2

Các IF tuyên bố trong SQL đòi hỏi một biểu thức boolean sau IF - xem the MSDN reference here.

SQL không phải là người giỏi nhất trong xử lý đúc giữa các loại mà không sử dụng một cái gì đó giống như CAST() hoặc CONVERT(), có nghĩa là trở về giá trị intISUNUMERIC() sẽ chỉ được giải quyết dưới dạng boolean khi bạn sử dụng một số so sánh (=, <,>, v.v.) để tạo kết quả đúng/sai.

IF ISNUMERIC('5675754674') = 1 có lẽ là cách tốt nhất để viết điều này trong TSQL - mô tả rõ ràng ý định của 'Nếu giá trị này chạy qua hàm này trả về 1 (có thể được đánh giá dưới dạng kiểu dữ liệu số), thì hãy làm điều này.'

Với ý nghĩ đó, bạn nên lưu ý rằng ISNUMERIC chỉ kiểm tra xem giá trị bạn chuyển vào sẽ đánh giá thành loại dữ liệu số có sẵn không. Điều này có thể dẫn đến rắc rối nếu dữ liệu bạn đang chạy qua chứa ký hiệu khoa học hoặc các bất thường khác; xem here để biết thêm thông tin.

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