5 Stimmen

Wie kann ich wiederholte Ausdrücke in einer SQL-Abfrage herausrechnen? Spalten-Aliase scheinen nicht die Lösung zu sein

Ich habe also eine Abfrage, die in etwa so aussieht:

SELECT id, 
    DATE_FORMAT(CONVERT_TZ(callTime,'+0:00','-7:00'),'%b %d %Y') as callDate, 
    DATE_FORMAT(CONVERT_TZ(callTime,'+0:00','-7:00'),'%H:%i') as callTimeOfDay, 
    SEC_TO_TIME(callLength) as callLength
FROM cs_calldata WHERE 
    customerCode='999999-abc-blahblahblah' AND 
    CONVERT_TZ(callTime,'+0:00','-7:00') >= '2010-04-25' AND
    CONVERT_TZ(callTime,'+0:00','-7:00') <= '2010-05-25'

Wenn es Ihnen wie mir geht, denken Sie wahrscheinlich, dass es die Lesbarkeit und möglicherweise die Leistung dieser Abfrage verbessern würde, wenn ich sie nicht auffordere, Folgendes zu berechnen CONVERT_TZ(callTime,'+0:00','-7:00') vier verschiedene Male.

Ich versuche also, einen Spaltenalias für diesen Ausdruck zu erstellen und weitere Vorkommen durch diesen Alias zu ersetzen:

SELECT id, 
    CONVERT_TZ(callTime,'+0:00','-7:00') as callTimeZoned,
    DATE_FORMAT(callTimeZoned,'%b %d %Y') as callDate, 
    DATE_FORMAT(callTimeZoned,'%H:%i') as callTimeOfDay, 
    SEC_TO_TIME(callLength) as callLength
FROM cs_calldata WHERE 
    customerCode='5999999-abc-blahblahblah' AND 
    callTimeZoned >= '2010-04-25' AND
    callTimeZoned <= '2010-05-25'

Da habe ich gelernt, um das MySQL-Handbuch zu zitieren:

Standard-SQL verbietet Verweise auf Spaltenaliasen in einer WHERE-Klausel. Diese Einschränkung wird auferlegt, wenn wenn die WHERE-Klausel ausgewertet wird, der Spaltenwert möglicherweise noch nicht bestimmt.

Dieser Ansatz scheint also im Sande verlaufen zu sein.

Wie soll jemand, der Abfragen mit wiederkehrenden Ausdrücken wie diesem schreibt, damit umgehen?

6voto

Bill Karwin Punkte 493880

Sie können Aliase in einer abgeleiteten Tabelle definieren und dann in der äußeren Abfrage auf sie verweisen:

SELECT callTimeZoned, callLength,
    DATE_FORMAT(callTimeZoned,'%b %d %Y') as callDate, 
    DATE_FORMAT(callTimeZoned,'%H:%i') as callTimeOfDay 
FROM (
    SELECT
        CONVERT_TZ(callTime,'+0:00','-7:00') as callTimeZoned,
        SEC_TO_TIME(callLength) as callLength
    FROM cs_calldata
    WHERE customerCode='5999999-abc-blahblahblah'
) AS d
WHERE 
    callTimeZoned BETWEEN '2010-04-25' AND '2010-05-25'

2voto

Abdul Raheem Punkte 21
SELECT id, 
    CONVERT_TZ(callTime,'+0:00','-7:00') as callTimeZoned,
    DATE_FORMAT(callTimeZoned,'%b %d %Y') as callDate, 
    DATE_FORMAT(callTimeZoned,'%H:%i') as callTimeOfDay, 
    SEC_TO_TIME(callLength) as callLength
FROM cs_calldata WHERE 
    customerCode='5999999-abc-blahblahblah' having
    callTimeZoned >= '2010-04-25' AND
    callTimeZoned <= '2010-05-25'

(Beachten Sie den Wechsel von AND a having in der drittletzten Zeile).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X