2014-12-10 24 views
7

Ho una query piuttosto ampia che sta cercando di ottenere un elenco di operatori e confrontare l'importo dell'assicurazione che hanno registrato per identificare i vettori che non soddisfano una soglia minima. Se eseguo la query di selezione funziona perfettamente senza errori. Ma quando cerco di usarlo per un inserimento in una tabella che restituisce questo messaggio di erroreErrore 1366 - Valore decimale errato: '' per colonna '' alla riga -1

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

devo usare il cast come decimale in fondo a questa interrogazione perché il valore che viene memorizzato nella il database è un varchar e non posso cambiarlo.

Qualcuno ha qualche idea?

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

Anche questo errore. È molto strano che la colonna "" e la riga -1 attivino un errore sul valore decimale errato. Hai mai trovato una soluzione? – LarsH

+1

Nel mio caso, l'errore si è verificato durante il tentativo di modificare il tipo di dati di una colonna da varchar (10) in decimale (6, 3). La colonna aveva già valori come 3, 5, 6.1, NULL ... e un'istanza di 'VGA'! Risultò che quest'ultimo era il colpevole; ma il messaggio di errore non aveva ancora alcun senso: il valore: '', colonna '' e riga -1 erano tutti segnalati falsamente. – LarsH

risposta

1

Se il select sembra funzionare, allora ci sono due possibili problemi. Il primo è che il select non funziona davvero e il problema appare più in basso nei dati. Restituire una o una manciata di righe non è sempre lo stesso di "lavoro".

Il secondo è un'incompatibilità con i tipi per l'inserto. Si può provare a utilizzare la conversione in silenzio per convertire i valori nel select ai numeri:

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 

Questo può sembrare brutto, ma non è così brutto come la memorizzazione di ids come stringhe in una tabella e come numeri in un altro.

+0

Darò una prova e vedrò. Grazie! –

+0

Ancora non sembra funzionare. Sono un po 'perso ... se rimuovo il cast qui sotto restituisce i record che non voglio essere influenzato, con esso sta lanciando questo errore –

+0

Rimozione 'CAST()' con dati impuri e usando altre conversioni è sicuramente la soluzione per questo. Ho appena avuto questo problema con ** MySQL 5.6.25 ** in una query molto grande con 3 calcoli complicati risultanti in colonne 'DECIMAL'. Sono stato in grado di 'SELECT' clean, ma' INSERT' non è riuscito. Anche 'CREATE TABLE AS SELECT ...;' ha fallito con lo stesso errore. Nel mio caso l'errore era sempre l'errore corretto, ma i dati di errore: valore, riga e colonna erano errati e inaffidabili. – ebyrob