OracleCASEWHEN用法介绍
Oracle CASE WHEN 用法介绍
1. CASE WHEN 表达式有两种形式
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
2. CASE WHEN 在语句中不同位置的用法
2.1 SELECT CASE WHEN 用法
SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1为男生,
2位女生*/
ELSE NULL
END) 男生数,
COUNT (CASE WHEN sex = 2 THEN 1
ELSE NULL
END) 女生数
FROM students GROUP BY grade;
2.3 WHERE CASE WHEN 用法
SELECT T2.*, T1.*
FROM T1, T2
WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
T1.SOME_TYPE LIKE 'NOTHING%'
THEN 1
WHEN T2.COMPARE_TYPE != 'A' AND
T1.SOME_TYPE NOT LIKE 'NOTHING%'
THEN 1
ELSE 0
END) = 1
2.4 GROUP BY CASE WHEN 用法
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class, -- 别名命名
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
3.关于IF-THEN-ELSE的其他实现
3.1 DECODE() 函数
select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from employees;
貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人
不推荐使用。
3.2 在WHERE中特殊实现
SELECT T2.*, T1.*
FROM T1, T2
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE
'NOTHING%')
OR
(T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE
'NOTHING%')
这种方法也是在特殊情况下使用,要多注意逻辑,不要弄错。
oracle字符串分割函数与casewhenin使用
oracle字符串分割函数与casewhenin使用Oracle数据库提供了多种字符串分割函数和CASE WHEN语句的使用。
1.字符串分割函数:- SUBSTR:返回一个字符串的一部分。
可以指定起始位置和长度。
例如:SUBSTR('Oracle', 2, 3) 返回 'rac'- INSTR:返回一个字符串中指定子字符串的位置。
例如:INSTR('Oracle Database', 'Database') 返回 8- REGEXP_SUBSTR:返回符合正则表达式的子字符串。
例如:REGEXP_SUBSTR('The quick brown fox', '[[:alpha:]]+') 返回 'The'2.CASEWHEN语句:CASEWHEN语句用于根据特定条件执行不同的操作。
例如:```SELECTcolumn1,CASEWHEN column2 = 'A' THEN 'Option 1'WHEN column2 = 'B' THEN 'Option 2'ELSE 'Other Option'END AS column3FROMtable1;```在上面的例子中,根据column2的值,column3将被赋予不同的选项。
3.使用CASEWHEN和IN语句联合查询:```SELECTcolumn1,CASEWHEN column2 IN ('A', 'B') THEN 'Option 1'WHEN column2 IN ('C', 'D') THEN 'Option 2'ELSE 'Other Option'END AS column3FROMtable1;```在上面的例子中,根据column2的值,在column3中赋予不同的选项。
oracle中的casewhenthenelseend用法
oracle中的casewhenthenelseend⽤法Case when 的⽤法,简单Case函数简单CASE表达式,使⽤表达式确定返回值. 语法: CASE search_expression WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN resultN ELSE default_result搜索CASE表达式,使⽤条件确定返回值. 语法: CASE WHEN condition1 THEN result1 WHEN condistion2 THEN result2 ... WHEN condistionN THEN resultN ELSE default_result END 例: select product_id,product_type_id, case when product_type_id=1 then 'Book' when product_type_id=2 then 'Video' when product_type_id=3 then 'DVD' when product_type_id=4 then 'CD' else 'Magazine' end from products这两种⽅式,可以实现相同的功能。
简单Case函数的写法相对⽐较简洁,但是和Case搜索函数相⽐,功能⽅⾯会有些限制,⽐如写判断式。
还有⼀个需要注意的问题,Case函数只返回第⼀个符合条件的值,剩下的Case部分将会被⾃动忽略。
⽐如说,下⾯这段SQL,你永远⽆法得到“第⼆类”这个结果代码如下CASE WHEN col_1 IN ( 'a', 'b') THEN '第⼀类'WHEN col_1 IN ('a') THEN '第⼆类'ELSE'其他' END下⾯我们来看⼀下,使⽤Case函数都能做些什么事情。
Oracle-casewhen用法-行列转换
Oracle 行列转换1、固定列数的行列转换如转换为语句如下:create table tb_chengji (student varchar2(20),subject varchar2(20),g rade num ber);select student,sum(case subject when'语文'then grade end)"语文",sum(case subject when'数学'then grade end)"数学",sum(case subject when'英语'then grade end)"英语",sum(grade) "总分"from tb_chengjigroup by student;或者select student,sum(decode(subject,'语文',grade,null)) "语文",sum(decode(subject,'数学',grade,null)) "数学",sum(decode(subject,'英语',grade,null)) "英语",sum(grade) "总分"from tb_chengjigroup by student;2、不定列行列转换如c1 c2--- -----------1 我1 是1 谁2 知2 道3 不……转换为1 我是谁2 知道3 不这一类型的转换可以借助于PL/SQL来完成,这里给一个例子create table ttt (c1 number,c2 varchar2(10));select*from ttt;create or replace function get_c2(tmp_c1 number)return varchar2iscol_c2 varchar2(4000);beginfor cur in(select c2 from ttt where c1=tmp_c1)loopcol_c2 := col_c2||cur.c2;end loop;col_c2 := rtrim(col_c2,1);return col_c2;end;select distinct c1 ,get_c2(c1) cc2 from tttorder by c1;或者不用pl/sql,利用分析函数和CONNECT_BY 实现:select c1, substr (max(sys_connect_by_path (c2,';')),2)name from(select c1, c2, rn, lead (rn) over (partition by c1 order by rn) rn1 from(select c1, c2, row_number () over (order by c2) rnfrom ttt))start with rn1 is nullconnect by rn1 =prior rngroup by c1;3、列数不固定(交叉表行列转置)这种是比较麻烦的一种,需要借助pl/sql:原始数据:CLASS1 CALLDATE CALLCOUNT1 2005-08-08 401 2005-08-07 62 2005-08-08 773 2005-08-09 333 2005-08-08 93 2005-08-07 21转置后:CALLDATE CallCount1 CallCount2 CallCount3------------ ---------- ---------- ----------2005-08-09 0 0 332005-08-08 40 77 92005-08-07 6 0 21试验如下:1). 建立测试表和数据CREATE TABLE t22(class1 VARCHAR2(2BYTE),calldate DATE,callcount INTEGER);INSERT INTO t22(class1, calldate, callcount)VALUES('1', TO_DATE ('08/08/2005','MM/DD/YYYY'),40); INSERT INTO t22(class1, calldate, callcount)VALUES('1', TO_DATE ('08/07/2005','MM/DD/YYYY'),6); INSERT INTO t22(class1, calldate, callcount)VALUES('2', TO_DATE ('08/08/2005','MM/DD/YYYY'),77); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/09/2005','MM/DD/YYYY'),33); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/08/2005','MM/DD/YYYY'),9); INSERT INTO t22(class1, calldate, callcount)VALUES('3', TO_DATE ('08/07/2005','MM/DD/YYYY'),21);COMMIT ;select calldate,nvl(max(case when class1 =1then callcount end),0)a1, nvl(max(case when class1 =2then callcount end),0) a2, nvl(max(case when class1 =3then callcount end),0)a3 from t22group by calldateorder by calldate desc;CALLDATE CallCount1 CallCount2 CallCount3------------ ---------- ---------- ----------2005-8-9 0 0 332005-8-8 40 77 92005-8-7 6 0 21。
Oracle中CASEWHEN的用法实例
Oracle中CASEWHEN的⽤法实例实例演⽰: (1)查询表users中的数据。
select u.id,u.realname,U.SEX from users u; 查询结果如下 ID REALNAME SEX1 10082 松XX 2 10084 林XX 1 3 10087 西XX 4 10100 胡XX 5 10102 龙XX 1 ...... (2)上表结果中的"sex"是⽤代码表⽰的,希望将代码⽤中⽂表⽰。
可在语句中使⽤CASE语句。
select u.id,u.realname,U.SEX,( case u.sexwhen 1 then '男'when 2 then '⼥'else '空的'END) 性别from usersu; 查询结果 ID REALNAME SEX 性别1 10082 松XX 空的 2 10084 林XX 1 男 3 10087 西XX 空的 4 10100 胡XX 空的 5 10102 龙XX 1 男 ...... 如果不希望列表中出现"sex"列,语句如下select u.id,u.realname,( case u.sexwhen 1 then '男'when 2 then'⼥'else '空的'END) 性别from users u; (3)将sum与case结合使⽤,可以实现分段统计。
例如现在我希望将上表中各种性别的⼈数进⾏统计,sql语句如下selectsum( case u.sex when 1 then 1 else 0 end) 男性,sum( case u.sexwhen 2 then 1 else 0 end) ⼥性,sum( case when u.sex<>1 andu.sex<>2 then 1 else 0 end) 性别为空from usersu; 执⾏结果如下 男性⼥性性别为空 1 41 15 0 如果学校内有数千名学⽣进⾏了考试,想统计60分以下、60-80分、80-100分的总⼈数,就可以使⽤这样的语句来实现。
ORACLE多条件的统计查询(casewhen)
ORACLE多条件的统计查询(casewhen)前⼏天要做⼀个统计查询的功能,因为涉及多张表,多种条件的统计分析。
⼀开始便想到了UNION和IF语句,然后写了1000多⾏代码,就为了查30条数据觉得不应该。
然后就开始百度,多种条件下的统计。
然后有⼀种语法让我眼前⼀亮,case when then else end当满⾜CASE设定的条件时,就可以执⾏then语句。
由于我要做的分组查询统计,是要罗列每⼀种情况,⽽且根据输⼊的“管理员编号”不同返回不同结果,结果记录的条数和每⼀种情况是可知的,这个语法完全可⽤核⼼代码如下:SELECT SUBSTR(A.业务,1,2) ⾏政区域,SUBSTR(A.业务,3,LENGTH(A.业务)-2) 业务模块,A.已结案,A.办理中,A.案件总数,ROUND(A.已结案 /decode(A.案件总数, 0, 9999,A.案件总数), 4) * 100 || '%' 完成率FROM(SELECT '市级律师服务' 业务,1 排序,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 IN('ztdm1','ztdm2') THEN 1 ELSE 0 END) 已结案,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 NOT IN('ztdm1','ztdm2') THEN 1 ELSE 0 END) 办理中,SUM(CASE WHEN 区县代码 IS NULL AND (TRUNC(委托时间, 'DD') BETWEEN V_SJQ AND V_SJZ) AND 申请状态代码 IS NOT NULL THEN 1 ELSE 0 END) 案件总数FROM TA_律师申请委托)AWHERE A.排序 IN(V_排序1,V_排序2,V_排序3,V_排序4,V_排序5)ORDER BY A.排序;通过排序号,来控制不同管理员查询的数据范围不同:V_排序1 INTEGER;V_排序2 INTEGER;V_排序3 INTEGER;V_排序4 INTEGER;V_排序5 INTEGER;-----------------------------SELECTDECODE(P_管理员编号,'test1',2,'test2',3,'test3',4,'test4',5) INTO V_排序1 FROM DUAL;V_排序2:=V_排序1+6;V_排序3:=V_排序1+12;V_排序4:=V_排序1+18;V_排序5:=V_排序1+24;⽬前测试数据量不⼤,优化前后性能差别不明显,但是代码⾏数减少了3倍以上,可读性明显增强,少了很多IF判断,理论上复杂度减少很多。
ORACLECASEWHEN及SELECTCASEWHEN的用法
ORACLECASEWHEN及SELECTCASEWHEN的⽤法Case具有两种格式。
简单Case函数和Case搜索函数。
--简单Case函数CASE sexWHEN '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下⾯我们来看⼀下,使⽤Case函数都能做些什么事情。
⼀,已知数据按照另外⼀种⽅式进⾏分组,分析。
有如下数据:(为了看得更清楚,我并没有使⽤国家代码,⽽是直接⽤国家名作为Primary Key)国家(country)⼈⼝(population)中国600美国100加拿⼤100英国200法国300⽇本250德国200墨西哥50印度250根据这个国家⼈⼝数据,统计亚洲和北美洲的⼈⼝数量。
应该得到下⾯这个结果。
洲⼈⼝亚洲1100北美洲250其他700想要解决这个问题,你会怎么做?⽣成⼀个带有洲Code的View,是⼀个解决⽅法,但是这样很难动态的改变统计的⽅式。
oracle when用法
oracle when用法标题:深入理解Oracle WHEN用法在Oracle数据库中,WHEN语句是一种条件控制语句,主要用于在SQL查询和PL/SQL块中实现逻辑判断。
它在多种场景下都有应用,如CASE表达式、DECODE函数、IF-THEN-ELSE语句等。
以下我们将一步一步解析Oracle WHEN的用法。
一、CASE表达式中的WHENCASE表达式是Oracle中最常用的条件判断语句之一,其基本语法如下:CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE result_nEND;在这个结构中,WHEN关键字后面跟着一个条件(condition),如果这个条件为真,那么就返回对应的result。
如果所有的WHEN条件都不满足,那么就会执行ELSE后面的语句。
例如,我们有一个员工表EMP,包含薪水字段SALARY,我们想根据薪水的不同范围给员工分类:sqlSELECTemployee_name,CASEWHEN salary <= 3000 THEN 'Low'WHEN salary <= 6000 THEN 'Medium'ELSE 'High'END AS salary_levelFROM emp;在这个查询中,WHEN语句用于判断薪水的范围,并返回相应的分类。
二、DECODE函数中的WHENDECODE函数是Oracle中的另一个条件判断函数,其基本语法如下:DECODE(expression, value1, result1, value2, result2, ...,default_result)在这个结构中,WHEN的用法与CASE表达式类似,只不过它是通过比较expression和value来决定返回哪个result。
例如,我们仍然使用上述的EMP表,但这次我们使用DECODE函数来进行分类:sqlSELECTemployee_name,DECODE(salary,<= 3000, 'Low',<= 6000, 'Medium','High') AS salary_levelFROM emp;在这个查询中,WHEN的用法体现在每个value和result的对应关系上。
Oracle中的casewhenthenelseend用法详解
Oracle中的casewhenthenelseend⽤法详解⽬录阐述适⽤情景举例说明结合其他语⾔理解⼩结阐述case when then else end可以理解为流程控制语句或条件控制语句。
可以实现资料获取的时候,可以更多的条件和⾃定义逻辑。
适⽤情景case when then else end作为数据库查询⼊门必掌握的技能。
对已知的数据库中数据,按照⾃⼰的逻辑,进⾏⾃定义分组和数据分析⽤此条件控制语句,实现⾃定义条件分组条件控制语句中嵌套函数达到理想的计算效果其他举例说明*对已知的数据库中数据,按照⾃⼰的逻辑,进⾏⾃定义分组和数据分析*⾸先SD_GSS表中数据如下YYEAR NO199221992319924201752017620177然后,摆出⾃⼰的逻辑,对主键进⾏逻辑定义,另外⼀个栏位不变,1992年定义为'⽣⽇年',2017年定义为'新年'SELECTCASE YYEARWHEN '1992'THEN '⽣⽇年'ELSE '新年'END YYEARFROMSD_GSS结果如下YYEAR⽣⽇年⽣⽇年⽣⽇年新年新年新年⽤此条件控制语句,实现⾃定义条件分组SELECTCASE YYEARWHEN '1992'THEN '⽣⽇年'ELSE '新年'END DATED,NOFROMSD_GSSEND结尾时,⾃定义栏位,其余部门和上述SQL⼀致DATED NO⽣⽇年2⽣⽇年3⽣⽇年4新年5新年6新年7条件控制语句中嵌套函数达到理想的计算效果SELECTCASE YYEARWHEN '1992'THEN ROUND(YYEAR/9,5)ELSE YYEAR+100END DATED,NOFROMSD_GSS上⾯SQL意思是,1992年,让此主键除9,除不尽,⽤ROUND函数,⼩数点后保留5位,否则加100DATED NO221.333332221.333333221.333334211752117621177结合其他语⾔理解很多⼈拿⾯相对象语⾔和建筑做对⽐,C语⾔是基础,是⾯向对象语⾔基础。
casewhenelse用法oracle
在Oracle 数据库中,CASEWHENELSE 是一个条件表达式,用于根据给定的条件对一个或多个表达式进行条件性的求值。
语法如下:
```sql
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result
END
```
其中:
* `condition1`, `condition2`... 是条件表达式,用于指定条件。
* `result1`, `result2`... 是与每个条件关联的结果表达式。
* `ELSE` 子句是可选的,用于指定当没有任何条件匹配时的默认结果。
下面是一个示例,演示如何使用CASEWHENELSE 表达式:
```sql
SELECT
employee_id,
first_name,
CASE
WHEN salary > 5000 THEN 'High Salary'
WHEN salary > 3000 THEN 'Medium Salary'
ELSE 'Low Salary'
END AS salary_category
FROM
employees;
```
在这个示例中,根据不同的工资水平,将员工的工资分为"High Salary"、"Medium Salary" 和"Low Salary" 三个类别,并将结果作为"salary_category" 列返回。
oracle case when用法sql
oracle case when用法sqlOracleCaseWhen用法SQL是一种极其重要且多用的语句,它可以运用于执行复杂逻辑功能,涉及到数据查询、转换以及分类等工作。
在Oracle数据库中,Case When语句提供了一种方便的检索及管理数据的方式。
Case When句的使用方式主要有以下几种:1.单的case when语句简单的Case When句是用来对一个字段或表达式进行判断,根据条件的设置,如果判断结果为True,则显示某值,如果判断结果为False,则显示另外一值。
简单的Case When句的形式如下:SELECT CASEWHEN con1 THEN result1WHEN con2 THEN result2ELSE result3END2.合Case When语句复合Case When句与简单Case When句不同,复合Case When句可以对多个字段进行判断,并对其返回值进行计算。
复合Case When 句的形式如下:SELECTCASEWHEN con1 THEN (result1 + result2)WHEN con2 THEN result3ELSE result4END3. Searched Case When语句Searched Case When句可以对多个字段进行判断,与复合Case When句不同的是,Searched Case When句可以返回不同的结果,而不仅仅是一个结果。
Searched Case When句的形式如下:SELECTCASEWHEN con1 THEN result1WHEN con2 THEN result2ELSE result3END实际上,Case When句也可以用来编写各种条件查询等,例如: SELECTCASEWHEN age <= 18 THEN ChildWHEN age > 18 AND age <30 THEN YoungWHEN age >30 AND age <50 THEN Mid-ageELSE OldEND AS Age_GroupFROM PeopleCase When句有时也可以用来编写统计查询,例如:SELECTSUM(CASE WHEN类 = A THEN量 ELSE 0 END) AS A数量,SUM(CASE WHEN类 = B THEN量 ELSE 0 END) AS B数量,SUM(CASE WHEN类 = C THEN量 ELSE 0 END) AS C数量FROM在Oracle中,Case When句的使用并不是新事物,它的出现主要是为了更好地处理复杂的条件和逻辑,并且可以很容易地处理各种复杂的数据查询操作。
