Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truyền ký hiệu khoa học (từ varchar -> số) trong một chế độ xem

Có một vài vấn đề khác nhau đồng thời xuất hiện ở đây. Hãy xem xét một số trong số chúng:

  1. Bạn đang truyền các số dưới dạng DECIMAL (18, 18). Điều đó có nghĩa là "cho tôi một số có chỗ cho TỔNG 18 ký tự và 18 ký tự trong số đó phải ở sau số thập phân". Điều đó hoạt động tốt miễn là số của bạn nhỏ hơn 0 (đúng với tất cả các số E) nhưng nó sẽ bị hỏng nếu bạn cố gắng sử dụng nó trên các số> 0. Đối với các số> 0, chỉ cần truyền là DECIMAL mà không chỉ định bất kỳ điều gì khác .

  2. Trong trường hợp bạn thêm "WHEN @d like '% E +%' THEN CAST (@d AS FLOAT)", bạn sẽ nhận được các kết quả khác nhau cho các số <0 bởi vì engine ngầm truyền kết quả khác. Tôi không biết các quy tắc về cách máy chủ sql quyết định truyền kết quả CASE, nhưng rõ ràng việc thực hiện thay đổi được đề xuất của bạn khiến công cụ sửa lại nó theo một cách khác. Truyền rõ ràng các kết quả đó dưới dạng số thập phân sẽ khắc phục được sự cố.

  3. Bạn cần phải LTRIM và RTRIM kết quả của mình một cách nhất quán. Bạn có thể thêm LTRIM và RTRIM vào mỗi câu lệnh trường hợp hoặc bạn có thể chỉ LTRIM và RTRIM kết quả của trường hợp đó.

Đây là một giải pháp sẽ giải quyết hoàn toàn mọi thứ:

SELECT
    LTRIM(RTRIM(CASE 
        WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
        WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
        ELSE @d
    END))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Triển khai LocalDB trên PC khách

  2. Làm cách nào để xóa khỏi nhiều bảng bằng INNER JOIN trong máy chủ SQL

  3. openrowset cho excel:chúng ta có thể bỏ qua một số hàng không?

  4. Ms SQL address.STDistance trả về khoảng cách sai

  5. T-SQL Subquery Max (Date) và Joins