2012-05-09 25 views
68

Tôi đang nhập dữ liệu từ một bảng có nguồn cấp dữ liệu thô trong Varchar, tôi cần phải nhập một cột trong varchar vào một cột chuỗi. Tôi đã thử sử dụng <column_name>::integer cũng như to_number(<column_name>,'9999999') nhưng tôi nhận được lỗi, vì có một vài trường trống, tôi cần truy xuất chúng dưới dạng trống hoặc không vào bảng mới.typecast string thành số nguyên - Postgres

Vui lòng cho tôi biết nếu có chức năng giống nhau.

+3

Bạn có thể cho chúng tôi thấy thông báo lỗi không? Điều đó sẽ giúp –

Trả lời

72

hoang dã đoán: Nếu giá trị của bạn là một chuỗi rỗng, bạn có thể sử dụng NULLIF để thay thế nó cho một NULL:

SELECT 
    NULLIF(your_value, '')::int 
18

Nếu bạn cần phải đối xử với cột rỗng như NULL s, hãy thử này:

SELECT CAST(nullif(<column>, '') AS integer); 

Mặt khác, nếu bạn có NULL giá trị mà bạn cần phải tránh, hãy thử:

SELECT CAST(coalesce(<column>, '0') AS integer); 

Tôi đồng ý, thông báo lỗi sẽ giúp ích rất nhiều.

8

Tôi không thể nhận xét (danh tiếng quá ít? Tôi khá mới) trên bài đăng của Lukas.

Mở thiết lập PG của tôi to_number(NULL) không hoạt động, vì vậy giải pháp của tôi sẽ là:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END 
FROM table 
+1

Điều này sẽ làm việc, nhưng nó phải là một tương đương chính xác của phương thức 'NULLIF()' ít chi tiết hơn. Tiêu chuẩn thực sự định nghĩa NULLIF như là một dạng của biến vị ngữ CASE. – kgrittn

41

Bạn thậm chí có thể đi một xa hơn và hạn chế trên sân coalesced này như, ví dụ: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field 
from <table> 
where CAST(coalesce(<column>, '0') AS integer) >= 10; 
14

Cách duy nhất tôi thành công để không gặp lỗi vì NULL, hoặc các ký tự đặc biệt hoặc chuỗi rỗng bằng cách thực hiện việc này:

SELECT REGEXP_REPLACE(COALESCE(<column>, '0'), '[^0-9]*' ,'0')::integer FROM table 
+2

Đối với tôi (9.6.2) đây là điều duy nhất hoạt động, tất cả các câu trả lời khác đều thất bại. –