Wie kann ich in einer SQL-Abfrage wiederholt Ausdrücke ausklammern? Spaltenaliasnamen scheinen nicht das Ticket zu sein
-
04-10-2019 - |
Frage
Also, ich habe eine Abfrage bekam das sieht etwa so aus:
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 Sie wie ich sind, werden Sie wahrscheinlich denken beginnen, dass vielleicht wäre es die Lesbarkeit zu verbessern und möglicherweise die Leistung dieser Abfrage, wenn ich es nicht frage CONVERT_TZ(callTime,'+0:00','-7:00')
vier unterschiedliche Zeiten zu berechnen.
Also ich versuche, eine Spalte Alias ??für diesen Ausdruck zu erstellen und weitere Vorkommen ersetzen mit diesem Alias:
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'
Dies ist, wenn ich lernte das MySQL-Handbuch zu zitieren:
Standard SQL nicht zulässt, Verweise auf Spaltenaliasnamen in einer WHERE-Klausel. Dies Beschränkung wird auferlegt, da, wenn die WHERE-Klausel ausgewertet wird, die Spaltenwert kann noch nicht gewesen bestimmt.
So, das Konzept scheint tot im Wasser zu sein.
Wie jemand Abfragen mit wiederkehrenden Ausdrücke wie dieses Schreiben soll man damit umgehen?
Lösung
Sie können Aliase in einer abgeleiteten Tabelle definieren und sie dann in der äußeren Abfrage 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'
Andere Tipps
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'