几个常用函数-Oracle

朱雀 2023-06-12 08:53 88阅读 0赞

1、decode 函数

  1. 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
  2. 该函数的含义如下:
  3. IF 条件=值1 THEN
  4. RETURN(翻译值1)
  5. ELSIF 条件=值2 THEN
  6. RETURN(翻译值2)
  7. ......
  8. ELSIF 条件=值n THEN
  9. RETURN(翻译值n)
  10. ELSE RETURN(缺省值) END IF

使用方法:

1)比较大小

  1. select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
  2. sign()函数根据某个值是0、正数还是负数,分别返回01、-1

2) IF-THEN-ELSE语句相似

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 值相同的数据类型,这个数据类型也是返回值的类型。

  1. select decode(dir,1,0,1) from a1_interval
  2. dir 的值是1变为0,是0则变为1
  3. 比如我要查询某班男生和女生的数量分别是多少?
  4. 通常我们这么写:
  5. select count(*) from where 性别 男;
  6. select count(*) from where 性别 女;
  7. 要想显示到一起还要union一下,太麻烦了
  8. decode呢,只需要一句话
  9. select decode(性别,男,10),decode(性别,女,10 from

3)order by对字符列进行特定的排序

  1. 例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。
  2. 这时,就可以非常轻松的使用Decode完成要求了。
  3. select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)

4)LISTAGG() within group()

对查询的子数据去重合并
LISTAGG(合并字段,连接符) within group(排序字段)

  1. 需求:查询编号绑定的部门,显示编号的详细信息,部门名称合并显示
  2. select rule.*,
  3. (select name
  4. from (select nd.no_id as id,
  5. LISTAGG(dp.name, ',') within group(order by dp.name) as name
  6. from sys_number_dept nd, sys_dept dp
  7. where nd.dept_id = dp.id
  8. group by nd.no_id)
  9. where id = rule.id)
  10. from sys_number_rule rule
  11. where rule.DELETE_STATUS = 1;

5)start with connect by prior 递归查询用法

start with :遍历起始条件,有个小技巧,如果要查父结点,这里可以用子结点的列,反之亦然。

connect by :连接条件。
关键词prior:prior跟父节点列放在一起,就是往父结点方向遍历;prior跟子结点列放在一起,则往叶子结点方向遍历。

  1. //例如:
  2. SELECT D.ID
  3. FROM SYS_DEPT D
  4. START WITH D.ID = '7125805245709b55c1919dd623308259'
  5. CONNECT BY nocycle D.PARENT_ID = PRIOR D . ID
  6. AND D.DELETE_STATE = 1
  7. //nocycle :避免死循环,
  8. //本例查询所有的子部门,包括2级和3级部门

6)将NVARCHAR2转换为VARCHAR2:

  1. declare
  2. v_username varchar2(12) ;
  3. v_nm_login nvarchar2(12);
  4. begin
  5. select utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(v_nm_login))
  6. into v_username
  7. from dual;
  8. end;

7 将VARCHAR2转换为NVARCHAR2:

  1. declare
  2. v_username varchar2(12) := 'pavan408';
  3. v_nm_login nvarchar2(12);
  4. begin
  5. select utl_raw.cast_to_nvarchar2(utl_raw.cast_to_raw(v_username))
  6. into v_nm_login
  7. from dual;
  8. end;

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读