2014-12-10 3 views
7

이동 통신사 목록을 얻고 이동 통신사를 식별하기 위해 보유하고있는 보험 금액을 비교하려고하는 다소 큰 쿼리가 있습니다 최소 임계 값을 충족시키지 못합니다. select 쿼리를 실행하면 오류없이 올바르게 작동합니다. 나는 테이블에 삽입을 위해 그것을 사용하려고하면 그러나이 오류 메시지가오류 1366 - 올바르지 않은 10 진수 값 : '' '열'에 -1 행

[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;` 
+0

이 오류도 발생합니다. 아주 이상한 열 ''을 가지고 행 -1 잘못된 10 진수 값에 대한 오류를 트리거합니다. 해결 방법을 찾았습니까? – LarsH

+1

제 경우에는 열의 데이터 유형을 varchar (10)에서 10 진수 (6, 3)로 변경하려고 할 때 오류가 발생했습니다. 열에 이미 3, 5, 6.1, NULL ... 및 'VGA'인스턴스가 하나 있습니다. 후자가 범인 이었다는 것이 밝혀졌습니다. 하지만 오류 메시지는 여전히 의미가 없습니다. 값 : '', 열 ''및 행 -1은 모두 잘못보고되었습니다. – LarsH

답변

1

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 

이 추한으로 보일 수도 있지만, 하나 개의 테이블에서 문자열로 ID를 저장하는 등 다른의 숫자만큼 추한되지 않습니다 : 당신은 숫자에 select의 값을 변환하는 자동 변환을 사용하려고 할 수 있습니다.

+0

나는 그걸 시험해 볼 것입니다. 감사! –

+0

여전히 작동하지 않는 것 같습니다. 나는 아직도 잃어버린 것 같습니다. 아래 캐스트를 벗어나면 영향을 받고 싶지 않은 레코드가 반환됩니다.이 에러가 발생합니다. –

+0

부정한 데이터로 다른 CAST()를 제거하고 다른 변환을 사용하면 확실히 이것에 대한 수정. 난 단지 MySQL 5.6.25 **에이 문제가 있었는데, 3 개의 복잡한 계산을하는 매우 큰 쿼리에서'DECIMAL' 컬럼이 발생했습니다. 나는'선택'을 할 수 있었지만'INSERT'는 실패했습니다. CREATE TABLE AS SELECT ...;도 같은 오류로 실패했습니다. 내 경우에는 오류가 항상 올바른 오류 였지만 오류 데이터 : 값, 행 및 열이 정확하지 않고 신뢰할 수 없습니다. – ebyrob

관련 문제