错误1366 - 十进制值不正确:''表示第-1行的列''

Nat*_* II 7 mysql varchar decimal

我有一个相当大的查询,试图获取一个运营商列表,并比较他们记录的保险金额,以确定不符合最低门槛的运营商.如果我运行select查询它可以正常工作,没有错误.但是当我尝试将其用于插入表时,它会返回此错误消息

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

我必须在此查询的底部使用强制转换为十进制,因为存储在数据库中的值是varchar,我无法更改它.

有人有主意吗?

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;`
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 1

如果select看起来有效,那么可能有两个问题。首先,这并select没有真正起作用,问题出现在数据的更下方。返回一行或几行并不总是与“工作”相同。

第二个是与刀片类型不兼容。您可以尝试使用静默转换将 中的值转换为select数字:

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
Run Code Online (Sandbox Code Playgroud)

这可能看起来很丑陋,但它并不像将 id 作为字符串存储在一个表中并在另一个表中存储为数字那么丑陋。