use*_*605 23 sql oracle sql-update
我写了一个像SQL Server中的魅力一样的查询.不幸的是,它需要在Oracle数据库上运行.我一直在网上搜索有关如何转换它的解决方案,但没有任何成功:/
查询看起来像这样我的SQL:
UPDATE tab1 SET budgpost_gr1=
CASE WHEN (budgpost in (1001,1012,50055)) THEN 'BP_GR_A'
WHEN (budgpost in (5,10,98,0)) THEN 'BP_GR_B'
WHEN (budgpost in (11,876,7976,67465))
ELSE 'Missing' END`
Run Code Online (Sandbox Code Playgroud)
我的问题还在于,柱子budgetpost_gr1和预算邮件是字母数字,Oracle似乎希望将列表视为数字.该列表是预定义为逗号分隔列表的变量/参数,它们只是转储到查询中.
Tho*_*mas 33
你说预算邮件是字母数字.这意味着它正在寻找与字符串的比较.您应该尝试将参数括在单引号中(并且您在Case表达式中缺少最后的THEN).
UPDATE tab1
SET budgpost_gr1= CASE
WHEN (budgpost in ('1001','1012','50055')) THEN 'BP_GR_A'
WHEN (budgpost in ('5','10','98','0')) THEN 'BP_GR_B'
WHEN (budgpost in ('11','876','7976','67465')) THEN 'What?'
ELSE 'Missing'
END
Run Code Online (Sandbox Code Playgroud)
得到了一个可以运行的解决方案。但不知道这是否是最佳的。我所做的是根据http://blogs.oracle.com/aramamoo/2010/05/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement.html分割字符串
使用:
select regexp_substr(' 1, 2 , 3 ','[^,]+', 1, level) from dual
connect by regexp_substr('1 , 2 , 3 ', '[^,]+', 1, level) is not null;
所以我的最终代码如下所示($bp_gr1'是类似的字符串1,2,3):
UPDATE TAB1
SET BUDGPOST_GR1 =
CASE
WHEN ( BUDGPOST IN (SELECT REGEXP_SUBSTR ( '$BP_GR1',
'[^,]+',
1,
LEVEL )
FROM DUAL
CONNECT BY REGEXP_SUBSTR ( '$BP_GR1',
'[^,]+',
1,
LEVEL )
IS NOT NULL) )
THEN
'BP_GR1'
WHEN ( BUDGPOST IN (SELECT REGEXP_SUBSTR ( ' $BP_GR2',
'[^,]+',
1,
LEVEL )
FROM DUAL
CONNECT BY REGEXP_SUBSTR ( '$BP_GR2',
'[^,]+',
1,
LEVEL )
IS NOT NULL) )
THEN
'BP_GR2'
WHEN ( BUDGPOST IN (SELECT REGEXP_SUBSTR ( ' $BP_GR3',
'[^,]+',
1,
LEVEL )
FROM DUAL
CONNECT BY REGEXP_SUBSTR ( '$BP_GR3',
'[^,]+',
1,
LEVEL )
IS NOT NULL) )
THEN
'BP_GR3'
WHEN ( BUDGPOST IN (SELECT REGEXP_SUBSTR ( '$BP_GR4',
'[^,]+',
1,
LEVEL )
FROM DUAL
CONNECT BY REGEXP_SUBSTR ( '$BP_GR4',
'[^,]+',
1,
LEVEL )
IS NOT NULL) )
THEN
'BP_GR4'
ELSE
'SAKNAR BUDGETGRUPP'
END;
Run Code Online (Sandbox Code Playgroud)
有没有办法让它跑得更快?
| 归档时间: |
|
| 查看次数: |
175312 次 |
| 最近记录: |