表结构:表名:DETAIL_BOX
-----------------------------------------------------------------------------
| sn (Number) | name (varchar2) | date1 (date) | date2 (date) |
-----------------------------------------------------------------------------
| 2 | Ram | 26.11.2015 00:00:00 | NULL |
-----------------------------------------------------------------------------
| 3 | Sita | NULL | 26.11.2015 00:00:00 |
-----------------------------------------------------------------------------
我需要带动态列的单个SQL更新语句 名称取决于案例。
案例如果 date2 在 date1 中为null更新日期 否则更新 date2
中的日期值下面的SQL语句是否有可能?
有如下查询的任何查询吗?
UPDATE DETAIL_BOX SET name='Gita', NVL(date2,date1)=to_date('2015-10-16', 'YYYY-MM-DD') WHERE sn=2
期望: 更新字段 date1 中的日期值,因为 date2 字段在sn = 2的行中为NULL。
有如下查询的任何查询吗?
UPDATE DETAIL_BOX SET name='Krish', NVL(date2,date1)=to_date('2015-10-16', 'YYYY-MM-DD') WHERE sn=3
期望: 更新字段 date2 中的日期值,因为 date2 字段在sn = 3的行中不为NULL。
注意:以上UPDATE sql查询不正确。我只是把这些查询问到任何Update语句都可以设置动态列名来设置值。
答案 0 :(得分:2)
我不确定sn进来的地方,但希望通用方法会有所帮助。
更新update语句中的两个字段,但要根据case语句将它们设置为自己或新日期:
UPDATE DETAIL_BOX SET date2= case when date2 is null then date2 else to_date('2015-10-16', 'YYYY-MM-DD') end
, date1 = case when date 2 is null then to_date('2015-10-16', 'YYYY-MM-DD') else date1 end
答案 1 :(得分:1)
请查看这是否有帮助。
想法是将所有列包含在一个更新语句中,然后根据您的标准,您可以决定是让它们更改还是让它们保持原状。
UPDATE detail_box
SET NAME = CASE WHEN sn = 2 THEN 'gita' WHEN sn= 3 THEN 'Krish' ELSE NAME END ,
date1 = CASE WHEN date1 IS NULL AND sn = 2 THEN date1 WHEN date1 IS NOT NULL AND sn = 2 THEN to_date('24-Nov-2014') ELSE date1 END ,
date2=CASE WHEN date2 IS NULL and sn= 3 THEN date2 WHEN date2 IS NULL and sn= 3 then to_date('24-Nov-2014') else date2 END
答案 2 :(得分:1)
我会把两个答案(由BeanFrog和Prabhat Sharma)放在一起。在我看来,根据标准将列更新为新值或自身是一个很好的解决方案。
update detail_box
set
name = decode(sn, 2, 'Gita', 3, 'Krish', name),
date1 = (case when sn = 2 and date2 is null then to_date('2015-10-16', 'YYYY-MM-DD') else date1 end),
date2 = (case when sn = 3 and date2 is null then to_date('2015-10-16', 'YYYY-MM-DD') else date2 end)
请注意,decode
函数特定于ORACLE数据库。如果您想拥有与RDBMS供应商无关的公共代码,则可以将其更改为case
结构。