如果db中的注册日期值为null,我希望能够更新用户注册日期和修改日期,否则只需更新修改日期。我当前的查询如下:
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中执行此操作,还是应该在我的服务器代码中添加一些逻辑?
答案 0 :(得分:0)
您缺少计数参数。请尝试count(<your_id_column_name>)
来计算。
答案 1 :(得分:0)
如@a_horse_with_no_name所述,您无法以这种方式使用IF / THEN语句。这是通过PL / SQL实现的,在您的情况下可能是一个过程。 现在我想以这样一个事实为前提,即我并不擅长PL / SQL,但这就是我所能想到的,你可以试一试。
它与你的例子非常相似,但我已经填满了&#39;?&#39;用我强烈的假设是你想要的。它应该是可读的,但是使用参数调用该过程 它会检查你在with语句中所做的检查。列数填满了总数&#39;变量和基于该结果的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)