如何在条件的基础上设置动态列名在SQL Query的UPDATE语句中设置值?

时间:2015-11-19 09:22:12

标签: sql oracle

表结构:表名: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语句是否有可能?

  • 更新具有sn = 2
  • 的行
  • 有如下查询的任何查询吗?

    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。

  • 更新具有sn = 3
  • 的行
  • 有如下查询的任何查询吗?

    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语句都可以设置动态列名来设置值。

3 个答案:

答案 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结构。