2014-12-10 45 views
7

Tôi có một truy vấn khá lớn đang cố gắng lấy danh sách nhà cung cấp dịch vụ và so sánh số tiền bảo hiểm mà họ có trong hồ sơ để xác định nhà cung cấp dịch vụ không đáp ứng ngưỡng tối thiểu. Nếu tôi chạy truy vấn chọn nó hoạt động tốt mà không có lỗi. Nhưng khi tôi cố gắng sử dụng nó cho một chèn vào một bảng nó sẽ trả về thông báo lỗi nàyLỗi 1366 - Giá trị thập phân không chính xác: '' cho cột '' tại hàng -1

[Err] 1366 - Incorrect decimal value: '' for column '' at row -1

tôi phải sử dụng các diễn viên như thập phân ở dưới cùng của truy vấn này vì giá trị đang được lưu trữ trong các cơ sở dữ liệu là một varchar và tôi không thể thay đổi điều đó.

Bất kỳ ai có ý tưởng nào?

set @cw_days = 15; 
INSERT INTO carrier_dnl (carrier_id, dnl_reason_id, status_id) 
SELECT work_cw_carrier_status_update.carrier_id, company_dnl_schema.dnl_reason_id, 
    CASE 
    WHEN work_cw_carrier_status_update.comparison_date > @cw_days THEN 1 
    ELSE 4 
    END as status 
    FROM work_cw_carrier_status_update 
    JOIN company_dnl_schema 
    ON company_dnl_schema.dnl_reason_id = 51 
    LEFT OUTER JOIN carrier_insurance 
    ON carrier_insurance.carrier_id = work_cw_carrier_status_update.carrier_id 
    WHERE ifnull(carrier_insurance.insurance_type_id,4) = 4 
    AND date(now()) BETWEEN IFNULL(carrier_insurance.insurance_effective_date,DATE_SUB(now(),INTERVAL 1 day)) AND IFNULL(carrier_insurance.insurance_expiration_date,DATE_ADD(now(),INTERVAL 1 day)) 
    AND CASE WHEN NULLIF(carrier_insurance.insurance_bipdto_amount,'') is null THEN 0 < company_dnl_schema.value 
    ELSE 
     ifnull(cast(replace(carrier_insurance.insurance_bipdto_amount, '*','') as decimal),0) < company_dnl_schema.value 
    END 
    AND (work_cw_carrier_status_update.b_bulk = 0 OR work_cw_carrier_status_update.b_bulk = 1) 
    AND (work_cw_carrier_status_update.b_otr = 1 OR work_cw_carrier_status_update.b_ltl = 1 
      OR work_cw_carrier_status_update.b_dray = 1 OR work_cw_carrier_status_update.b_rail = 1 
      OR work_cw_carrier_status_update.b_intermodal = 1 OR work_cw_carrier_status_update.b_forwarder = 1 
      OR work_cw_carrier_status_update.b_broker = 1) 
group by work_cw_carrier_status_update.carrier_id;` 
+0

Tôi cũng nhận được lỗi này. Rất lạ khi có cột '' và hàng -1 kích hoạt lỗi về giá trị thập phân không chính xác. Bạn đã bao giờ tìm cách giải quyết chưa? – LarsH

+1

Trong trường hợp của tôi, lỗi xảy ra khi cố gắng thay đổi kiểu dữ liệu của một cột từ varchar (10) thành thập phân (6, 3). Cột đã có các giá trị như 3, 5, 6.1, NULL ... và một phiên bản của 'VGA'! Hóa ra cái sau là thủ phạm; nhưng thông báo lỗi vẫn không có ý nghĩa gì: giá trị: '', cột '' và hàng -1 đều được báo cáo sai. – LarsH

Trả lời

1

Nếu select có vẻ hoạt động thì có hai vấn đề có thể xảy ra. Đầu tiên là select không thực sự hoạt động và vấn đề xuất hiện sâu hơn trong dữ liệu. Trả về một hoặc một số hàng không phải lúc nào cũng giống như "làm việc".

Thứ hai là sự không tương thích với các loại chèn. Bạn có thể thử sử dụng chuyển đổi im lặng để chuyển đổi các giá trị trong select đến các số:

SELECT work_cw_carrier_status_update.carrier_id + 0, company_dnl_schema.dnl_reason_id + 0, 
     (CASE WHEN work_cw_carrier_status_update.comparison_date > @cw_days THEN 1 
      ELSE 4 
     END) as status 

này có thể trông xấu xí, nhưng nó không phải là gần như xấu xí như lưu trữ id như các chuỗi trong một bảng và như số ở khác.

+0

Tôi sẽ thử xem. Cảm ơn! –

+0

Vẫn không có vẻ hiệu quả. Tôi sẽ mất ... nếu tôi bỏ dàn diễn viên bên dưới, nó sẽ trả về các bản ghi mà tôi không muốn bị ảnh hưởng, với nó nó sẽ ném lỗi này –

+0

Xóa 'CAST()' bằng dữ liệu không sạch và sử dụng các chuyển đổi khác là chắc chắn sửa chữa cho điều này. Tôi chỉ gặp vấn đề này với ** MySQL 5.6.25 ** trong một truy vấn rất lớn với 3 phép tính phức tạp dẫn đến cột 'DECIMAL'. Tôi đã có thể 'SELECT' sạch, nhưng' INSERT' thất bại. Thậm chí 'CREATE TABLE AS SELECT ...;' không thành công với cùng một lỗi. Trong trường hợp của tôi, lỗi luôn là lỗi chính xác, nhưng dữ liệu lỗi: giá trị, hàng và cột là không chính xác và không đáng tin cậy. – ebyrob

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