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子句时,可能尚未确定列值.
所以,这种方法似乎已经死了.
如何用这样的重复表达式编写查询来处理它?
您可以在派生表中定义别名,然后在外部查询中引用它们:
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)