Wie kann ich in einer SQL-Abfrage wiederholt Ausdrücke ausklammern? Spaltenaliasnamen scheinen nicht das Ticket zu sein

StackOverflow https://stackoverflow.com/questions/2909758

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?

War es hilfreich?

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top