chuyển đổi int thành thực trong sqlite


83

Phép chia trong sqlite trả về giá trị số nguyên

sqlite> select totalUsers/totalBids from 
(select (select count(*) from Bids) as totalBids , 
(select count(*) from Users) as totalUsers) A;
1

Chúng ta có thể đánh máy kết quả để nhận được giá trị thực của kết quả phép chia không?

Câu trả lời:


124

Chỉ cần nhân một trong các số với 1.0:

SELECT something*1.0/total FROM somewhere

Điều đó sẽ cung cấp cho bạn phép chia dấu phẩy động thay vì phép chia số nguyên.


4
Điều này không hiệu quả với tôi với SQLite 3.15 .. Giải pháp của @AdamGarner thực hiện được.
Ma0

1
Bạn thực sự không nên sử dụng thủ thuật này, vì rất dễ dàng cho các nhà phát triển (bao gồm cả bạn) quay lại và xóa những gì trông giống như mã thừa. Phương pháp tốt nhất là cast để float như tôi đã đề xuất bên dưới.
Adam Garner

1
Đây là một vụ hack. Cách tốt nhất, rõ ràng nhất, để làm điều này là sử dụng CAST. Cũng có khả năng điều này có thể xảy ra trong các tình huống cụ thể. Tôi đã thấy những thứ như thế này không thành công khi tạo một bảng dựa trên một truy vấn. Truyền giá trị đã khắc phục sự cố đó.
Mike

57

Trong Sqlite, phép chia một số nguyên cho một số nguyên khác sẽ luôn làm tròn xuống số nguyên gần nhất.

Do đó, nếu bạn chuyển điều tra viên của mình sang float:

SELECT CAST(field1 AS FLOAT) / field2

1
Vì vậy, tốt hơn là ép kiểu int theo cách thủ công thành float hoặc nhân với 1.0 (như @NullUserException đã trả lời)?
Felix Edelmann

2
Vâng, vì một lý do đơn giản. Bạn đang nói rõ ràng về những gì bạn dự định sẽ xảy ra. Và không đưa vào một cái gì đó dựa vào các nhà phát triển khác biết lý do tại sao bạn đã nhân với 1.
Adam Garner

4
@FelixEdelmann Ngoài ra, nếu bạn không ép kiểu float một cách rõ ràng, bản thân bạn thậm chí có thể quên mất lý do tại sao bạn có phiên bản 1.0 đó và xóa nó vào một lúc nào đó. Nó không chỉ áp dụng cho các nhà phát triển khác.
danuker

1
Để thêm vào điều này, như tôi đã nêu trong câu trả lời được chấp nhận, chúng tôi có một trường đang được tính toán (hợp pháp) và được sử dụng trong TẠO BẢNG với CHỌN và các giá trị quay trở lại dưới dạng giá trị TEXT (có thể đã chạm NULL hoặc một cái gì đó ). Truyền là thứ duy nhất giúp chúng tôi khắc phục sự cố.
Mike


3

hoặc nếu bạn muốn cập nhật cột dựa trên cột văn bản:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.