在WHERE子句中引用列别名

时间:2020-11-12 12:33:47

标签: mysql sql where-clause column-alias

是否可以使用WHERE或其他方式返回“ AS”结果?

我正在对FONE1列进行SUBSTRING并尝试返回DDD = 31,但出现错误, 代码:1054。“ where子句” 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'

这个想法是将回报率降低

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

谢谢!

2 个答案:

答案 0 :(得分:1)

我建议将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,因此不会错过最后一天的最后一秒。
  • 日期格式被简化。

答案 1 :(得分:1)

您不能在WHERE子句中使用输出列别名,因为尚未对输出列表达式求值,并且根本不存在hense。

但是您可以在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的答案-这非常有用。