SQL:如果绑定值等于它,则将字段更新为NULL,否则不使用PL/SQL保持不变?
我有一个带有SQL:如果绑定值等于它,则将字段更新为NULL,否则不使用PL/SQL保持不变?,sql,database,oracle,Sql,Database,Oracle,我有一个带有数值(38,0)字段的表,名为FOO。在UPDATE语句中,我已经在无条件地更新另外两个VARCHAR2字段BAR和BAZ 如果绑定值等于FOO,我如何巧妙地将FOO更新为NULL,否则保持不变?由于各种限制,我需要能够在没有PL/SQL的情况下做到这一点 示例1:如果当前记录的FOO为123,我需要一个UPDATE语句,其中FOO=123,BAR='Abc',BAZ='Def'更新BAR和BAZ,并将FOO设置为NULL 示例2:如果当前记录的FOO为123,我需要一个UPDATE
数值(38,0)
字段的表,名为FOO
。在UPDATE
语句中,我已经在无条件地更新另外两个VARCHAR2
字段BAR
和BAZ
如果绑定值等于FOO
,我如何巧妙地将FOO
更新为NULL,否则保持不变?由于各种限制,我需要能够在没有PL/SQL的情况下做到这一点
示例1:如果当前记录的FOO
为123,我需要一个UPDATE
语句,其中FOO=123,BAR='Abc',BAZ='Def'
更新BAR
和BAZ
,并将FOO
设置为NULL
示例2:如果当前记录的FOO
为123,我需要一个UPDATE
语句,其中FOO=299,BAR='Abc',BAZ='Def'
更新BAR
和BAZ
,但将FOO
保留为123
DB是Oracle
我试着用BITAND
和nvl
+其他人做了一些聪明的东西,但还没有找到有效的东西
谢谢vgort试试这个
UPDATE MyTable A SET
A.FOO = CASE WHEN A.FOO = YourBoundFOO THEN NULL ELSE A.FOO END,
A.BAR = 'Abc',
A.BAT = 'Def'
WHERE...
编辑-根据Andrey M的评论:
案例的另一种选择是使用
A.FOO = NULLIF (A.FOO,YourBoundFOO),
Yahia:在做这项工作的同时,我还做了以下工作:updatemytable set FOO=DECODE(BITAND(FOO,)、NULL,FOO)where…
知道哪个更快吗?@user1037084我会怀疑我的版本,因为你的版本嵌套了两个函数调用,而我的版本只是执行一个简单的“IF-THEN”—但我真的不确定,测量一下。。。请不要忘了将任何有帮助的答案投票/标记为已接受(请参阅):-)@Yahia:您的案例表达式基本上与NULLIF(A.FOO,yourbundfoo)
,否?@AndriyM是的,绝对。。。将其添加到帖子中以供将来参考。