【问题标题】:MySQL - SELECT AS in WHEREMySQL - 在 WHERE 中选择
【发布时间】:2013-01-03 01:05:30
【问题描述】:

由于某种原因,这不起作用:

select substring(rating, instr(rating,',') +1, +2) as val
from users where val = '15';

它给出了这个错误:

错误 1054 (42S22):“where 子句”中的未知列“val”

那我该怎么做呢?

【问题讨论】:

  • 如果您曾经发现自己不得不处理列的某些部分,那么您的架构是错误的。

标签: mysql sql select


【解决方案1】:

首先,您不能在WHERE 子句上使用ALIAS。您应该使用该列,

SELECT SUBSTRING(rating, INSTR(rating,',') +1, +2) AS val 
FROM   users 
WHERE  SUBSTRING(rating, INSTR(rating,',') +1, +2) = '15'

原因如下:操作顺序是SQL,

  • FROM 子句
  • WHERE 子句
  • GROUP BY 子句
  • HAVING 子句
  • SELECT 子句
  • ORDER BY 子句

ALIAS 发生在 SELECT 子句上,该子句位于 WHERE 子句之前。

如果您真的想使用别名,请将其包装在子查询中,

SELECT *
FROM
    (
        SELECT SUBSTRING(rating, INSTR(rating,',') +1, +2) AS val 
        FROM   users
    ) s
WHERE   val  = '15'

【讨论】:

  • 谢谢!别名的想法是最小化选择行;有点奇怪,你做不到;但是谢谢 - 上面的效果很好。
  • 这个解释并不完全合理,因为可以在GROUP BYHAVINGORDER BY 子句中使用列别名。
【解决方案2】:

val 没有定义,它只是一个别名。这样做:

SELECT SUBSTRING(rating, INSTR(rating,',') +1, +2) AS val 
FROM   users 
WHERE  SUBSTRING(rating, INSTR(rating,',') +1, +2) = 15

【讨论】:

    【解决方案3】:

    你可以使用这个查询

    SELECT SUBSTRING(rating, INSTR(rating,',') +1, +2)
    FROM   users 
    WHERE  SUBSTRING(rating, INSTR(rating,',') +1, +2) = '15'
    

    【讨论】:

    • 这似乎并不比现有答案更好。
    【解决方案4】:

    你肯定可以用 MySQL,请看下面,刚刚测试过,它工作正常:

    Select substring(rating, instr(rating,',') +1, +2) as val 
    From users 
    Having val = '15';
    

    您还可以执行“让 val 为空”等操作。

    使用 ALIAS 不能使用 WHERE,但使用 HAVING 可以解决问题。

    H

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2013-09-04
      • 2015-10-26
      • 2021-10-26
      • 1970-01-01
      • 2011-05-12
      • 2017-07-22
      相关资源
      最近更新 更多