龙空技术网

选读SQL经典实例笔记21_字符串处理

躺着的柒 202

前言:

现在姐妹们对“oracle字符串转列名查询”都比较关注,小伙伴们都需要剖析一些“oracle字符串转列名查询”的相关资讯。那么小编在网摘上搜集了一些对于“oracle字符串转列名查询””的相关知识,希望小伙伴们能喜欢,看官们快快来了解一下吧!

1. SQL 并不专门用于处理复杂的字符串1.1. 需要有逐字遍历字符串的能力。但是,使用SQL 进行这样的操作并不容易1.2. SQL 没有Loop循环功能1.2.1. Oracle的MODEL子句除外2. 遍历字符串2.1. 把EMP表的ENAME等于KING的字符串拆开来显示为4行,每行一个字符2.2. sql

select substr(e.ename,iter.pos,1) as C  from (select ename from emp where ename = 'KING') e,       (select id as pos from t10) iterwhere iter.pos <= length(e.ename)C-KING
2.3. T10表,该表有10行记录(它只有一列,列名为ID,它的值分别是从1到103. 嵌入引号3.1. sql
QMARKS--------------g'day matebeavers' teeth'
3.2. sql
select 'g''day mate' qmarks from t1 union allselect 'beavers'' teeth'    from t1 union allselect ''''                 from t1
4. 统计字符出现的次数4.1. 10,CLARK,MANAGER4.1.1. 该字符串里有多少个逗号4.2. sql
 select (length('10,CLARK,MANAGER')-       length(replace('10,CLARK,MANAGER',',','')))/length(',')       as cnt  from t1
4.3. 获取不含逗号的字符串长度4.4. 逗号的删除则借助了REPLACE函数5. 删除不想要的字符5.1. sql
ENAME             SAL---------- ----------SMITH             800ALLEN            1600WARD             1250JONES            2975MARTIN           1250BLAKE            2850CLARK            2450SCOTT            3000KING             5000TURNER           1500ADAMS            1100JAMES             950FORD             3000MILLER           1300
5.2. sql
ENAME      STRIPPED1         SAL STRIPPED2--------- ---------- ---------- ---------SMITH      SMTH              800 8ALLEN      LLN              1600 16WARD       WRD              1250 125JONES      JNS              2975 2975MARTIN     MRTN             1250 125BLAKE      BLK              2850 285CLARK      CLRK             2450 245SCOTT      SCTT             3000 3KING       KNG              5000 5TURNER     TRNR             1500 15ADAMS      DMS              1100 11JAMES      JMS               950 95FORD       FRD              3000 3MILLER     MLLR             1300 13
5.3. DB25.3.1. sql
select ename,       replace(translate(ename,'aaaaa','AEIOU'),'a','') stripped1,       sal,       replace(cast(sal as char(4)),'0','') stripped2  from emp
5.4. Oracle5.5. PostgreSQL5.6. 使用内置函数TRANSLATE和REPLACE删除不想要的字符和字符串5.6.1. sql
select ename,        replace(translate(ename,'AEIOU','aaaaa'),'a')        as stripped1,        sal,        replace(sal,0,'') as stripped2   from emp
5.7. MySQL5.8. SQL Server5.9. 多次调用REPLACE 函数5.9.1. sql
select ename,        replace(        replace(        replace(        replace(        replace(ename,'A',''),'E',''),'I',''),'O',''),'U','')        as stripped1,        sal,        replace(sal,0,'') stripped2   from emp
6. 分离数字和字符数据6.1. sql
DATA---------------SMITH800ALLEN1600WARD1250JONES2975MARTIN1250BLAKE2850CLARK2450SCOTT3000KING5000TURNER1500ADAMS1100JAMES950FORD3000MILLER1300
6.2. DB26.2.1. sql
select replace(    translate(data,'0000000000','0123456789'),'0','') ename,          cast(       replace(     translate(lower(data),repeat('z',26),           'abcdefghijklmnopqrstuvwxyz'),'z','') as integer) sal    from (  select ename||cast(sal as char(4)) data    from emp           ) x
6.3. Oracle6.3.1. sql
select replace(      translate(data,'0123456789','0000000000'),'0') ename,      to_number(        replace(        translate(lower(data),                  'abcdefghijklmnopqrstuvwxyz',                   rpad('z',26,'z')),'z')) sal   from ( select ename||sal data   from emp        )
6.4. PostgreSQL6.4.1. sql
select replace(      translate(data,'0123456789','0000000000'),'0','') as ename,           cast(        replace(      translate(lower(data),                'abcdefghijklmnopqrstuvwxyz',                rpad('z',26,'z')),'z','') as integer) as sal   from ( select ename||sal as data   from emp        ) x
7. 按照子字符串排序7.1. sql
ENAME----------SMITHALLENWARDJONESMARTINBLAKECLARKSCOTTKINGTURNERADAMSJAMESFORDMILLER
7.2. DB27.3. Oracle7.4. PostgreSQL7.5. MySQL7.6. 使用内置函数LENGTH和SUBSTR7.6.1. sql
select ename   from emp  order by substr(ename,length(ename)-1,2)
7.7. SQL Server7.7.1. sql
select ename  from emp order by substring(ename,len(ename)-1,2)
8. 根据字符串里的数字排序8.1. sql
DATA-----------------------------CLARK   7782 ACCOUNTINGKING    7839 ACCOUNTINGMILLER  7934 ACCOUNTINGSMITH   7369 RESEARCHJONES   7566 RESEARCHSCOTT   7788 RESEARCHADAMS   7876 RESEARCHFORD    7902 RESEARCHALLEN   7499 SALESWARD    7521 SALESMARTIN  7654 SALESBLAKE   7698 SALESTURNER  7844 SALESJAMES   7900 SALES
8.2. DB28.2.1. sql
select data   from V  order by         cast(      replace(    translate(data,repeat('#',length(data)),      replace(    translate(data,'##########','0123456789'),             '#','')),'#','') as integer)
8.3. Oracle8.3.1. sql
select data   from V  order by         to_number(           replace(         translate(data,           replace(         translate(data,'0123456789','##########'),                  '#'),rpad('#',20,'#')),'#'))
8.4. PostgreSQL8.4.1. sql
select data   from V  order by         cast(      replace(    translate(data,      replace(    translate(data,'0123456789','##########'),             '#',''),rpad('#',20,'#')),'#','') as integer)
9. 识别字符串里的数字字符9.1. sql
MIXED--------------CL10ARKI10NGMI10LL73697566778878767902ALLENWARDMARTINBLAKETURNERJAMES
9.2. DB29.2.1. sql
select mixed old,        cast(          case          when             replace(           translate(mixed,'9999999999','0123456789'),'9','') = ''          then             mixed          else replace(             translate(mixed,                repeat('#',length(mixed)),              replace(               translate(mixed,'9999999999','0123456789'),'9','')),                       '#','')           end as integer ) mixed   from V  where posstr(translate(mixed,'9999999999','0123456789'),'9') > 0
9.3. Oracle9.3.1. sql
select to_number (        case        when           replace(translate(mixed,'0123456789','9999999999'),'9')          is not null        then             replace(           translate(mixed,             replace(          translate(mixed,'0123456789','9999999999'),'9'),                    rpad('#',length(mixed),'#')),'#')        else              mixed        end        ) mixed  from V where instr(translate(mixed,'0123456789','9999999999'),'9') > 0
9.4. PostgreSQL9.4.1. sql
select cast(        case        when         replace(translate(mixed,'0123456789','9999999999'),'9','')         is not null        then           replace(          translate(mixed,            replace(          translate(mixed,'0123456789','9999999999'),'9',''),                    rpad('#',length(mixed),'#')),'#','')        else          mixed        end as integer ) as mixed    from V  where strpos(translate(mixed,'0123456789','9999999999'),'9') > 0
9.5. MySQL9.5.1. sql
select cast(group_concat(c order by pos separator '') as unsigned)        as MIXED1   from ( select v.mixed, iter.pos, substr(v.mixed,iter.pos,1) as c   from V,        ( select id pos from t10 ) iter  where iter.pos <= length(v.mixed)    and ascii(substr(v.mixed,iter.pos,1)) between 48 and 57        ) y  group by mixed  order by 1
10. 提取第n个分隔子字符串10.1. sql
create view V asselect 'mo,larry,curly' as name  from t1 union allselect 'tina,gina,jaunita,regina,leena' as name  from t1
10.2. sql
SUB-----larry gina
10.3. DB210.3.1. sql
select substr(c,2,locate(',',c,2)-2)  from (select pos, name, substr(name, pos) c,       row_number() over(partition by name                       order by length(substr(name,pos)) desc) rn  from (select ',' ||csv.name|| ',' as name,       cast(iter.pos as integer) as pos  from V csv,       (select row_number() over() pos from t100 ) iter where iter.pos <= length(csv.name)+2       )  x where length(substr(name,pos)) > 1   and substr(substr(name,pos),1,1) = ','       ) y where rn = 2
10.4. Oracle10.4.1. sql
select sub   from ( select iter.pos,        src.name,        substr( src.name,         instr( src.name,',',1,iter.pos )+1,         instr( src.name,',',1,iter.pos+1 ) -         instr( src.name,',',1,iter.pos )-1) sub   from (select ','||name||',' as name from V) src,        (select rownum pos from emp) iter  where iter.pos < length(src.name)-length(replace(src.name,','))        )  where pos = 2
10.5. PostgreSQL10.5.1. sql
select name   from ( select iter.pos, split_part(src.name,',',iter.pos) as name   from (select id as pos from t10) iter,        (select cast(name as text) as name from v) src  where iter.pos <=         length(src.name)-length(replace(src.name,',',''))+1        ) x  where pos = 2
10.6. MySQL10.6.1. sql
select name   from ( select iter.pos,        substring_index(        substring_index(src.name,',',iter.pos),',',-1) name   from V src,        (select id pos from t10) iter,  where iter.pos <=        length(src.name)-length(replace(src.name,',',''))        ) x where pos = 2
10.7. SQL Server10.7.1. sql
select substring(c,2,charindex(',',c,2)-2)   from ( select pos, name, substring(name, pos, len(name)) as c,        row_number() over(         partition by name         order by len(substring(name,pos,len(name))) desc) rn   from ( select ',' + csv.name + ',' as name,         iter.pos   from V csv,        (select id as pos from t100 ) iter  where iter.pos <= len(csv.name)+2        ) x  where len(substring(name,pos,len(name))) > 1    and substring(substring(name,pos,len(name)),1,1) = ','        ) y  where rn = 2
11. 解析IP地址11.1. 111.22.3.411.2. sql
A     B     C     D----- ----- ----- ---111   22    3     4
11.3. DB211.3.1. sql
with x (pos,ip) as (   values (1,'.92.111.0.222')   union all  select pos+1,ip from x where pos+1 <= 20 )  select max(case when rn=1 then e end) a,         max(case when rn=2 then e end) b,         max(case when rn=3 then e end) c,         max(case when rn=4 then e end) d    from (  select pos,c,d,         case when posstr(d,'.') > 0 then substr(d,1,posstr(d,'.')-1)              else d         end as e,         row_number() over(order by pos desc) rn    from (  select pos, ip,right(ip,pos) as c, substr(right(ip,pos),2) as d    from x   where pos <= length(ip)     and substr(right(ip,pos),1,1) = '.'        ) x        ) y
11.4. Oracle11.4.1. sql
select ip,       substr(ip, 1, instr(ip,'.')-1 ) a,       substr(ip, instr(ip,'.')+1,                   instr(ip,'.',1,2)-instr(ip,'.')-1 ) b,       substr(ip, instr(ip,'.',1,2)+1,                   instr(ip,'.',1,3)-instr(ip,'.',1,2)-1 ) c,       substr(ip, instr(ip,'.',1,3)+1 ) d  from (select '92.111.0.2' as ip from t1)
11.5. PostgreSQL11.5.1. sql
select split_part(y.ip,'.',1) as a,        split_part(y.ip,'.',2) as b,        split_part(y.ip,'.',3) as c,        split_part(y.ip,'.',4) as d   from (select cast('92.111.0.2' as text) as ip from t1) as y
11.6. MySQL11.6.1. sql
select substring_index(substring_index(y.ip,'.',1),'.',-1) a,       substring_index(substring_index(y.ip,'.',2),'.',-1) b,       substring_index(substring_index(y.ip,'.',3),'.',-1) c,       substring_index(substring_index(y.ip,'.',4),'.',-1) d  from (select '92.111.0.2' as ip from t1) y
11.7. SQL Server11.7.1. sql
with x (pos,ip) as (    select 1 as pos,'.92.111.0.222' as ip from t1    union all   select pos+1,ip from x where pos+1 <= 20  )  select max(case when rn=1 then e end) a,         max(case when rn=2 then e end) b,         max(case when rn=3 then e end) c,         max(case when rn=4 then e end) d    from (  select pos,c,d,         case when charindex('.',d) > 0              then substring(d,1,charindex('.',d)-1)              else d         end as e,         row_number() over(order by pos desc) rn    from (  select pos, ip,right(ip,pos) as c,         substring(right(ip,pos),2,len(ip)) as d    from x  where pos <= len(ip)    and substring(right(ip,pos),1,1) = '.'       ) x       ) y

标签: #oracle字符串转列名查询