2016-07-17 6 views
1

Ich versuche herauszufinden, warum diese Abfrage SELECT gut, aber ich kann es nicht verwenden, um eine temporäre Tabelle zu erstellen ... Die IF = '', 0 Sachen waren nicht in der ursprünglichen Abfrage vorhanden, so dass ich es zu machen Sicher, dass ich nicht versucht habe, etwas zu summieren, das möglicherweise eine leere Zeichenfolge sein könnte, aber es hat das Problem nicht behoben. Wählen Sie diese Option funktioniert und gibt das richtige Ergebnis Satz:MySQL-Abfrage funktioniert wie normal SELECT, aber nicht in CREATE TABLE AS ..?

SELECT 
    SUM(((IF(reserve_transactions.Revenue = '', 
     0, 
     reserve_transactions.Revenue) * IF(reserve_transactions.Confidence = '', 
     0, 
     reserve_transactions.Confidence))/100)) AS rawadjusted 
FROM 
    (store_locations 
    LEFT JOIN reserve_transactions ON ((store_locations.ID = location_sales))) 
GROUP BY store_locations.Loc_Long 

Aber dies nicht:

CREATE TEMPORARY TABLE tmptable_which_doesnt_work AS SELECT 
    SUM(((IF(reserve_transactions.Revenue = '', 
     0, 
     reserve_transactions.Revenue) * IF(reserve_transactions.Confidence = '', 
     0, 
     reserve_transactions.Confidence))/100)) AS rawadjusted 
FROM 
    (store_locations 
    LEFT JOIN reserve_transactions ON ((store_locations.ID = location_sales))) 
GROUP BY store_locations.Loc_Long 

Der Fehler ist: Error Code: 1292. Truncated incorrect DECIMAL value: ''

ich weitere Fragen haben, wo die Situation die gleiche ist, tatsächlich . Manchmal mit anderen abgeschnittenen falschen Typen. Was fehlt mir hier?

+1

Vielleicht sind Sie in einem 'strict sql mode' – 1000111

+0

Ich würde sagen, Ihre Datenbank ist schlecht entworfen, wenn' Revenue' ist eine 'VARCHAR' Spalte, wenn es offensichtlich sollte sei eine numerische Spalte, z 'DECIMAL'. – Andreas

+0

Mögliches Duplikat von [mysql-Fehler 1292 bei Verwendung der Anweisung cast in update] (http://stackoverflow.com/q/21142273/5221149). – Andreas

Antwort

0

denke ich, dass das Problem Daten sein könnte und die Logik nur die numerischen Eingaben auszuwählen - Sie könnten versuchen, eine Funktion wie folgt zu definieren:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) 
RETURNS tinyint 
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

und wendet es in der where-Klausel für die beiden Argumente , trimmen Sie eventuell unnötige Leerstellen (nach How do I check to see if a value is an integer in MySQL?)

Verwandte Themen