如何在SQL查询中分解出重复的表达式?列别名似乎不是故障单

Wes*_*n C 3 sql select expression column-alias

所以,我有一个看起来像这样的查询:

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'
Run Code Online (Sandbox Code Playgroud)

如果你像我一样,你可能会开始认为,如果我没有要求它计算CONVERT_TZ(callTime,'+0:00','-7:00')四次单独的时间,它可能会提高可读性和可能的​​查询性能.

所以我尝试为该表达式创建一个列别名,并用该别名替换进一步的出现:

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'
Run Code Online (Sandbox Code Playgroud)

这是我学习的时候,引用MySQL手册:

标准SQL不允许在WHERE子句中引用列别名.强制执行此限制是因为在评估WHERE子句时,可能尚未确定列值.

所以,这种方法似乎已经死了.

如何用这样的重复表达式编写查询来处理它?

Bil*_*win 5

您可以在派生表中定义别名,然后在外部查询中引用它们:

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'
Run Code Online (Sandbox Code Playgroud)

  • 我不会指望 MySQL 结合内部和外部查询的行限制,但“EXPLAIN”将有助于以一种或另一种方式确认这一点。至少“customerCode”的条件位于内部查询中,因此限制了内部查询中的函数处理的行数。 (2认同)