繁体   English   中英

有没有一种方法可以为子查询设置别名,然后在if语句中使用别名?

[英]Is there a way to set an alias to a sub-query then use the alias in an if statement?

如果数据库中的注册日期值为空,我希望能够更新用户注册日期和修改日期,否则只需更新修改日期。 我当前的查询如下所示:

WITH notregistered AS (select * 
  from user 
  where userid = '1'
   AND registrationdate is null)
if (select count from notregistered) < 1 then 
  UPDATE USER SET name = ?, MODIFIEDDATE = ? WHERE ID = ?;
else
  UPDATE MANAGEDUSER SET name = ?, MODIFIEDDATE = ?, REGISTRATIONDATE =  ? WHERE ID = ?;
END IF;

但是似乎不能满足正确的sql语法。 有没有办法在sql中执行此操作,还是应该在服务器代码中添加一些逻辑?

您缺少用于计数的参数。 尝试使用count(<your_id_column_name>)来获取计数。

如@a_horse_with_no_name所述,您不能以这种方式使用IF / THEN语句。 这是通过PL / SQL实现的,在您的情况下,它可能是一个过程。 现在,我想以我不太擅长PL / SQL的事实作为开头,但这是我想出的,您可以尝试一下。

它与您的示例非常相似,但是我已经填写了“?” 什么我假设是你想要的。 它应该是可读的,但是使用参数调用该过程,并执行与with语句相同的检查。 该列数填充“ total”变量,并且IF / THEN根据该结果进行更新。

这是运行它的过程和命令。 经验丰富的人:随时提出改进建议,因为这对我也是一个学习方面。

CREATE OR REPLACE
PROCEDURE updateUser(
    param_name VARCHAR2,
    param_modifiedDate DATE,
    param_registrationDate DATE,
    param_userId NUMBER)
AS
  total NUMBER;
BEGIN
  SELECT
    COUNT(userid)
  INTO
    total
  FROM
    USER
  WHERE
    userid              = param_userId
  AND registrationdate IS NULL;
  IF total              = 0 THEN
    UPDATE
      USER
    SET
      name         = param_name,
      modifieddate = param_modifiedDate
    WHERE
      userid = param_userId;
  ELSE
    UPDATE
      manageduser
    SET
      name             = param_name,
      modifieddate     = param_modifiedDate,
      registrationdate = param_registrationDate
    WHERE
      userid = param_userId;
  END IF;
END;

执行:

EXECUTE updateuser('MyName', to_date('2014/07/17', 'yyyy/MM/dd'), to_date('2014/07/17', 'yyyy/MM/dd'), 1234)

暂无
暂无

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

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