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?