Oracle--decode函数、(case when then else end )和(update set replace)的用法

本文介绍了SQL中更新数据的方法及使用case和decode函数进行条件转换的技巧,包括replace函数更新字段值、case函数的不同形式及其注意事项、decode函数的多种应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、update set replace

update `表名` set 字段名 =replace(字段名, '查找的内容','更改的内容') where 字段名 like '%查找的内容%';
update shangpinTable set click_url=replace(click_url,'21508360','1111111111') where click_url like '%21508360%';
--------------------------------------------------------------------------------------------------
2、case when 
case具有两种格式。简单case函数和case搜索函数。
--简单case函数
            case sex
            when '1' then '男'
            when '2' then '女'
            else '其他' end
--case搜索函数
            case when sex = '1' then '男'
            when sex = '2' then '女'
            else '其他' end
这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。 
还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
--比如说,下面这段sql,你永远无法得到“第二类”这个结果
            case when col_1 in ( 'a', 'b') then'第一类'
            when col_1 in ('a')       then '第二类'
            else'其他'end
原文:http://blog.youkuaiyun.com/xuxurui007/article/details/8479953

-----------------------------------------------------------------------------------------------------

3.decode函数

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
       这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
 当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

使用方法: 
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2、此函数用在SQL语句中,功能介绍如下:
    Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。
结合Lpad函数,如何使主键的值自动加1并在前面补0
select LPAD(decode(count(记录编号),0,1,max(to_number(记录编号)+1)),14,'0') 记录编号 from tetdmis
比如我要查询某班男生和女生的数量分别是多少?通常我们这么写:
select count(*) from 表 where 性别 = 男;
select count(*) from 表 where 性别 = 女;
要想显示到一起还要union一下,太麻烦了

用decode呢,只需要一句话
select sum(decode(性别,男,1,0)),sum(decode(性别,女,1,0)) from 表

eg:
select sum(decode(siteno,'LT',1,0)),sum(decode(siteno,'SZ',1,0)) from facd605;
select sum(case siteno when 'LT' then 1 else 0 end),sum(case siteno when 'SZ' then 1 else 0 end) from facd605;





<think>好的,用户想了解SQL中CASE WHEN THEN ELSE END的嵌套用法,我需要详细解释并提供示例。首先,我得回忆一下CASE语句的基本结构,用户可能已经知道基础用法,现在需要更高级的嵌套使用。 根据之前的引用资料,比如引用[3]提到CASE函数只返回第一个符合条件的值,后面的条件会被忽略。这点在嵌套使用时需要注意,避免条件覆盖。另外,引用[5]里的示例展示了多条件的使用,但没有嵌套的情况,可能需要结合这些例子来构造嵌套的场景。 嵌套CASE通常有两种方式:一种是在THENELSE子句中使用另一个CASE表达式,另一种是在条件判断中包含子查询或其他表达式。用户可能需要实际的应用示例,比如分类更复杂的数据,或者在结果中进一步细分。 考虑到用户的需求,应该先解释语法结构,然后给出不同的嵌套示例。比如在THEN后面再嵌套一个CASE,或者在WHEN条件中使用子查询。同时要注意不同数据库的支持情况,比如Oracle可能推荐使用DECODE,但用户明确问的是CASE语句,所以应专注于标准SQL的用法。 需要确保示例清晰,比如员工工资分类,根据不同的条件进行多层判断。同时要指出注意事项,比如条件的顺序、性能影响等。可能还要比较嵌套CASE其他方法的优劣,帮助用户理解适用场景。 最后,生成相关问题时要围绕嵌套用法、性能优化、与其他函数的对比,以及常见错误等方面。这样用户如果有进一步的问题,可以自行探索。</think>### CASE WHEN THEN ELSE END嵌套用法详解 在SQL中,CASE表达式支持多层嵌套,通过嵌套可以实现更复杂的多级条件判断。嵌套分为两种形式:在THEN/ELSE子句中嵌套CASE表达式,或在WHEN条件中使用子查询。 #### 一、基础嵌套语法 ```sql CASE WHEN 条件1 THEN CASE WHEN 子条件A THEN 结果A ELSE 子结果A END WHEN 条件2 THEN 结果2 ELSE CASE WHEN 子条件B THEN 结果B ELSE 默认结果 END END ``` #### 二、典型嵌套场景示例 1. **多层级分类判断** ```sql SELECT employee_name, CASE WHEN salary > 10000 THEN '高管' WHEN salary BETWEEN 8000 AND 10000 THEN CASE WHEN department = 'IT' THEN '技术专家' ELSE '资深员工' END ELSE '普通员工' END AS employee_level FROM employees ``` *说明:对月薪>10000的直接标记为高管,8000-10000区间再按部门细分,其他归为普通员工* 2. **条件组合嵌套** ```sql SELECT product_id, CASE WHEN stock < 50 THEN CASE WHEN discontinued = 1 THEN '停产缺货' ELSE '紧急补货' END WHEN stock BETWEEN 50 AND 100 THEN '正常库存' ELSE '库存过剩' END AS stock_status FROM products ``` *通过库存量与停产状态组合生成更精确的库存状态标签[^5]* #### 三、子查询嵌套(Oracle示例) ```sql SELECT order_id, CASE WHEN (SELECT COUNT(*) FROM order_details WHERE order_id = o.order_id) > 5 THEN '大订单' ELSE CASE WHEN order_value > 5000 THEN '高值订单' ELSE '普通订单' END END AS order_type FROM orders o ``` *结合子查询判断订单类型,先按明细数量判断是否大订单,再按金额细分普通订单[^4]* #### 四、注意事项 1. **执行顺序**:CASE表达式按WHEN顺序执行,遇到第一个满足条件立即返回结果[^3] 2. **可读性**:建议嵌套不超过3层,过度嵌套会降低可维护性 3. **性能影响**:包含子查询的嵌套可能显著影响查询效率 4. **兼容性**:标准SQL支持,但各数据库对嵌套深度限制不同 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值