2014-12-10 10 views
7

ich eine ziemlich große Abfrage haben, die eine Liste von Ladungsträgern zu bekommen versucht und vergleichen Sie die Höhe der Versicherung, die sie in den Akten haben Träger zu identifizieren die einen Mindestschwellenwert nicht erfüllen. Wenn ich die Select-Abfrage ausführen, funktioniert es einwandfrei ohne Fehler. Aber wenn ich versuche, es in eine Tabelle für einen Einsatz zu verwenden, es gibt diese FehlermeldungFehler 1366 - Falsche Dezimalwert: ‚‘ für die Spalte ‚‘ in Zeile -1

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

Ich habe am Ende dieser Abfrage die Besetzung als Dezimalzahl verwenden, da der Wert, der in dem gespeichert wird Datenbank ist ein varchar und ich kann das nicht ändern.

Wer hat irgendwelche Ideen?

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

Ich bekomme diese auch Fehler. Sehr seltsam, dass die Spalte '' und die Zeile -1 einen Fehler über den falschen Dezimalwert auslösen. Haben Sie jemals einen Workaround gefunden? – LarsH

+1

In meinem Fall trat der Fehler beim Versuch, den Datentyp einer Spalte von Varchar (10) zu ändern, um eine Dezimalzahl (6, 3). Die Spalte hatte bereits Werte wie 3, 5, 6.1, NULL ... und eine Instanz von 'VGA'! Es stellte sich heraus, dass Letzterer der Täter war; aber die Fehlermeldung ergab immer noch keinen Sinn: Der Wert: '', Spalte '' und Zeile -1 wurden alle fälschlicherweise gemeldet. – LarsH

Antwort

1

Wenn die select scheint zu funktionieren, dann gibt es zwei mögliche Probleme. Die erste ist, dass die select nicht wirklich funktioniert und das Problem scheint weiter nach unten in den Daten. Die Rückgabe einer oder mehrerer Zeilen ist nicht immer gleichbedeutend mit "arbeiten".

Die zweite ist eine Inkompatibilität mit den Typen für den Einsatz. Sie können versuchen, automatische Konvertierung zu verwenden, um die Werte in den select in Zahlen zu umwandeln:

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 

Diese hässlich aussehen, aber es ist bei weitem nicht so hässlich wie ids als Zeichenfolge in einer Tabelle und als Zahlen in einer anderen zu speichern.

+0

Ich werde es versuchen und sehen. Vielen Dank! –

+0

Scheint immer noch nicht zu funktionieren. Ich bin verloren irgendwie noch ... wenn ich die Besetzung starten darunter Datensätze zurückgibt, die ich will nicht betroffen sein, damit es diesen Fehler ist das Werfen –

+0

Entfernen 'CAST()' mit unsauberen Daten und mit anderen Umwandlungen ist definitiv die Lösung dafür. Ich hatte gerade dieses Problem mit ** MySQL 5.6.25 ** in einer sehr großen Abfrage mit 3 komplizierten Berechnungen, die zu DECIMAL-Spalten führten. Ich konnte "SELECT" clean, aber "INSERT" schlug fehl. Sogar 'CREATE TABLE AS SELECT ...;' ist mit demselben Fehler fehlgeschlagen. In meinem Fall war der Fehler immer der richtige Fehler, aber die Fehlerdaten: Wert, Zeile und Spalte waren falsch und unzuverlässig. – ebyrob