【问题标题】:mysql view if else problemmysql查看是否有其他问题
【发布时间】:2023-04-01 06:47:02
【问题描述】:

我正在使用 mysql 视图,我想在该视图上使用 IF ELSE 语句。它给了我这样的错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if(getUser()="") THEN]
        select hie_code_1 from hs_hr_emp_level L,hs_hr_u' at line 7 

这是我的看法

drop view if exists   vw_hs_hr_employee;

CREATE VIEW vw_hs_hr_employee  as 
select * from hs_hr_employee where 
hie_code_1 in 
(
BEGIN

    if(getUser()="") THEN
        select hie_code_1 from hs_hr_emp_level L
    ELSE
           select hie_code_1 from hs_hr_emp_level L,hs_hr_users U
             where L.emp_number=U.emp_number
               and L.emp_number=getUser()
               and ( U.def_level=1 or U.def_level=4 )
    END if

)  

已编辑 这是我的功能

CREATE  FUNCTION `getUser`() RETURNS char(50) CHARSET latin1
RETURN  @user

如果有人可以帮助我,谢谢

更新的查询

CREATE VIEW vw_hs_hr_employee  as
select * from hs_hr_employee where
CASE getUser()
        WHEN  ''
    THEN 
    select hie_code_1 from hs_hr_emp_level L
    END
hie_code_1 in ( select hie_code_1 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  ( U.def_level=1 or U.def_level=4 )   )
or
 hie_code_3 in ( select hie_code_3 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  U.def_level=2   )
or
  hie_code_4 in ( select hie_code_4 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  U.def_level=3 ) 

给出错误syntax to use near 'select hie_code_1 from hs_hr_emp_level L END hie_code_1 in ( select hie_code_' at line 6

完成

drop view if exists  vw_hs_hr_employee;
CREATE VIEW vw_hs_hr_employee  as
select * from hs_hr_employee e where CASE WHEN getUser()=''
    THEN
     e.emp_number is not null
    ELSE
hie_code_1 in ( select hie_code_1 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  ( U.def_level=1 or U.def_level=4 )   )
or
 hie_code_3 in ( select hie_code_3 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  U.def_level=2   )
or
  hie_code_4 in ( select hie_code_4 from hs_hr_emp_level L,hs_hr_users U   where L.emp_number=U.emp_number and L.emp_number=getUser() and  U.def_level=3 )

end

【问题讨论】:

  • getUser() 应该是 CURRENT_USER() or USER() 吗?
  • 另外,视图应该是一个普通的 SELECT 语句,并且它们不允许像存储过程那样进行块流控制。因此,您需要使用 IF() or CASE...WHEN..END
  • 感谢您的回答我更新了查询,请参阅

标签: mysql views


【解决方案1】:

正如显眼所评论的那样,一个视图可以包含一个简单的SELECT 语句。

您可以将单个查询与CASE 块一起使用:

CREATE VIEW vw_hs_hr_employee  as 
SELECT *
FROM hs_hr_employee
WHERE CASE WHEN getUser() = ''
    THEN hie_code_1 IN (
        SELECT hie_code_1
        FROM hs_hr_emp_level)
    ELSE hie_code_1 IN (
        SELECT hie_code_1
        FROM hs_hr_emp_level L,hs_hr_users U
             WHERE L.emp_number=U.emp_number
               AND L.emp_number=getUser()
               AND ( U.def_level=1 or U.def_level=4))
    END

或者使用基于连接的查询,(创建第二个视图来解决 MySql 限制):

DROP VIEW IF EXISTS vw_hs_hr_employee_sub;

CREATE VIEW vw_hs_hr_employee_sub AS
SELECT hie_code_1
FROM hs_hr_emp_level L
    LEFT JOIN hs_hr_users U
        ON L.emp_number = U.emp_number
        AND L.emp_number = getUser()
        AND ( U.def_level=1 or U.def_level=4 )
WHERE getUser() = '' OR U.emp_number IS NOT NULL
GROUP BY 1;


drop view if exists   vw_hs_hr_employee;

CREATE VIEW vw_hs_hr_employee  as 
SELECT e.*
FROM hs_hr_employee e JOIN vw_hs_hr_employee_sub USING(hie_code_1)

【讨论】:

  • 错误说 View 的 SELECT 在 FROM 子句中包含子查询
  • 感谢您的回答仍有问题我更新了问题请参阅
【解决方案2】:

使用单引号!

...
if(getUser()='') THEN
...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2021-08-26
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多