在 WHERE 子句中引用列别名

Referencing a column alias in the WHERE clause

有什么方法可以使用 WHERE 或其他方式 return 一个“AS”结果吗?

我在 FONE1 列上做一个 SUBSTRING 并试图 return DDD = 31 但我得到了错误, 代码:1054。'where clause' 0.000 秒

中的未知列 'DDD'

-->

SELECT  **SUBSTRING(FONE1,1,2) AS DDD**, FONE1, F1STA,LASTCALL
FROM discador_processados
WHERE fila_mailing = 2638
AND F1STA ='ANSWER'
AND CLASSE1 IN ('VC2','VC3')
**AND DDD = 31**
AND LASTCALL BETWEEN '2020-10-02 00:00:00' AND '2020-10-30 23:59:59'

我的想法是让return低于

DDD    FONE1     F1STA      LASTCALL 
31  31999999999 ANSWER  2020-10-02 09:08:13
31  31999999999 ANSWER  2020-10-02 09:09:16
31  31999999999 ANSWER  2020-10-02 09:17:41

谢谢!

我建议将 WHERE 写成:

WHERE fila_mailing = 2638 AND
      F1STA ='ANSWER' AND
      CLASSE1 IN ('VC2', 'VC3') AND
      FONE1 LIKE '31%' AND
      LASTCALL >= '2020-10-02' AND
      LASTCALL < '2020-10-31'

注意逻辑的变化:

  • FONE1好像是一个字符串,所以比较使用string操作。
  • DATETIME 比较使用 >=< 而不是 BETWEEN,因此不会错过最后一天的最后一秒。
  • 日期格式已简化。

您不能在 WHERE 子句中使用输出列别名,因为输出列表达式尚未计算,因此根本不存在。

但您可以在 HAVING 子句中这样做:

SELECT SUBSTRING(FONE1,1,2) AS DDD, FONE1, F1STA,LASTCALL
FROM discador_processados
WHERE fila_mailing = 2638
  AND F1STA ='ANSWER'
  AND CLASSE1 IN ('VC2','VC3')
  AND LASTCALL BETWEEN '2020-10-02 00:00:00' AND '2020-10-30 23:59:59'
HAVING DDD = 31

并注意 Gordon Linoff 的回答 - 它非常有用。