简体   繁体   中英

SQL query by adding two columns in where clause?

I have a database table that contains two scores:

  • scoreA
  • scoreB

I am trying to make a SQL query by adding these two values, such as

SELECT *,(scoreA+scoreB) as scoreC FROM data WHERE scoreC > 100 ORDER BY scoreC DESC

However, it shows an error:

ERROR: Unknown column 'scoreC' in 'where clause'

Is there any way to work around for this?

PS the reason I don't add a new column for scoreC is because scoreA/scoreB are updated continuously by other cron jobs and if I want to calculate scoreC, I need to make extra queries/updates for scoreC, which I would like to avoid to save system resources. However, if it is the only way to calculate scoreC by another cron job, I am also ok with it if it's the only solution. Thanks.

MySQL supports a non-standard extension that allows you to use the having clause in this case:

SELECT *, (scoreA+scoreB) as scoreC
FROM data
HAVING scoreC > 100
ORDER BY scoreC DESC;

Let me emphasize that this is MySQL-specific. For a simple expression such as this, I would just put the formula in the where clause. But sometimes the expression can be quite complicated -- say a distance formula or complex case or subquery. In those cases, the having extension is actually useful.

And, you don't need the formula in the order by clause. MySQL allows column aliases there.

You can't use the derived column ScoreC in the where clause. However, you can do this:

SELECT *
FROM 
(
   SELECT *, (scoreA+scoreB) as scoreC 
   FROM data 
) x
WHERE x.ScoreC > 100 
ORDER BY x.ScoreC DESC;

Fiddle here

You cannot use the calculated fields name in where and order by but you can use the formula:

SELECT scorea + scoreb FROM data WHERE scorea+scoreb > 100 order BY scorea+scoreb

You also could create a view with the field scorec.

SELECT *,(scoreA+scoreB) as scoreC 
FROM data 
WHERE (scoreA+scoreB) > 100 
ORDER BY (scoreA+scoreB) DESC

You can use HAVING clause for this.

SELECT *,(scoreA+scoreB) as scoreC 
FROM data 
HAVING scoreC > 100
ORDER BY scoreC DESC;

From documentation: "The SQL standard requires that HAVING must reference only columns in the GROUP BY clause or columns used in aggregate functions. However, MySQL supports an extension to this behavior, and permits HAVING to refer to columns in the SELECT list and columns in outer subqueries as well."

You might be looking for HAVING clause

SELECT *,(scoreA+scoreB) as scoreC 
FROM data HAVING scoreC > 100 
ORDER BY scoreC DESC

现在可以在where子句中添加带有列名的条件

select * from hotel_rooms where (total_pax + extra_beds >= 3);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM