SQLクエリで繰り返しの式を考慮に入れるにはどうすればよいですか?列エイリアスはチケットではないようです
-
04-10-2019 - |
質問
だから、私はこのようなものに見えるクエリを持っています:
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'
あなたが私のようであれば、おそらく私がそれを計算するように頼まなかったなら、それは読みやすさとおそらくこのクエリのパフォーマンスを改善するだろうと考え始めるでしょう CONVERT_TZ(callTime,'+0:00','-7:00')
4回別々。
そこで、私はその表現の列エイリアスを作成し、そのエイリアスにさらに発生することを置き換えようとします。
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'
これは、MySQLマニュアルを引用することを学んだときです。
標準のSQLは、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'
他のヒント
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'
所属していません StackOverflow