简体   繁体   English

MySQL IF语句在计算列上

[英]MySQL IF statement on a calculated column

How can I use a calculated column in an SQL statement that uses an 'IF'Statement in the 'Where' clause. 如何在SQL语句中使用计算列,该语句在“ Where”子句中使用“ IF”语句。

My query is down below. 我的查询在下面。 I keep getting the error 我不断收到错误

Unknown column 'e_owner_id_church' in 'where clause'

SELECT idu,fname,lname,id_file,friendly_name,file_name,uploaded_by,date_uploaded,
file_last_modified,owner_id, 
CASE WHEN owned_by='church' THEN church_name WHEN owned_by='user' THEN CONCAT(fname, ' ', lname) END AS e_owner_name, 
CASE WHEN owned_by='church' THEN id_church END AS e_owner_id_church,
CASE WHEN owned_by='user' THEN idu END AS e_owner_id_user 
FROM files,file_affiliations,churches,users 
WHERE owner_id=IF(e_owner_id_church != null, e_owner_id_church, e_owner_id_user) 
GROUP BY file_id

This could work as a workaround using HAVING clause: 使用HAVING子句可以解决此问题:

SELECT idu
     , fname
     , lname
     , id_file
     , friendly_name
     , file_name
     , uploaded_by
     , date_uploaded
     , file_last_modified
     , owner_id
     , CASE owned_by
        WHEN 'church' THEN church_name
        WHEN 'user' THEN CONCAT(fname, ' ', lname)
       END AS e_owner_name
     , CASE owned_by
        WHEN 'church' THEN id_church
        ELSE NULL
       END AS e_owner_id_church
     , CASE owned_by
        WHEN 'user' THEN idu
        ELSE NULL
       END AS e_owner_id_user
FROM files
   , file_affiliations
   , churches
   , users 
GROUP BY file_id
HAVING owner_id = IFNULL(e_owner_id_church, e_owner_id_user)

I'd like to warn you that this query is not standard SQL, in fact it selects fields which are neither included in the GROUP BY clause nor are the result of a group function. 我想警告您,该查询不是标准的SQL,实际上,它选择的字段既不包含在GROUP BY子句中,也不包含在组函数的结果中。

Lastly, I think that the above could be simplified like this: 最后,我认为可以将以上内容简化如下:

SELECT idu
     , fname
     , lname
     , id_file
     , friendly_name
     , file_name
     , uploaded_by
     , date_uploaded
     , file_last_modified
     , owner_id
     , CASE owned_by
        WHEN 'church' THEN church_name
        WHEN 'user' THEN CONCAT(fname, ' ', lname)
        ELSE NULL
       END AS e_owner_name
     , CASE owned_by
        WHEN 'church' THEN id_church
        WHEN 'user' THEN idu
       END AS e_owner_id
FROM files
   , file_affiliations
   , churches
   , users 
GROUP BY file_id
HAVING owner_id = e_owner_id

didnt try it but something like that should work: 没有尝试过,但是类似的东西应该起作用:

SELECT idu,fname,lname,id_file,friendly_name,file_name,uploaded_by,date_uploaded,
file_last_modified,owner_id, 
CASE WHEN owned_by='church' THEN church_name WHEN owned_by='user' THEN CONCAT(fname, ' ', lname) END AS e_owner_name, 
CASE WHEN owned_by='church' THEN id_church END AS e_owner_id_church,
CASE WHEN owned_by='user' THEN idu END AS e_owner_id_user 
FROM files,file_affiliations,churches,users 

GROUP BY file_id
HAVING owner_id = COALESCE(e_owner_id_church, e_owner_id_church, e_owner_id_user) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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