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

news2024/11/24 22:43:03

 

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) iter
where iter.pos <= length(e.ename)
C
-
K
I
N
G

2.3. T10表,该表有10行记录(它只有一列,列名为ID,它的值分别是从1到10

3. 嵌入引号

3.1. sql

QMARKS
--------------
g'day mate
beavers' teeth
'

3.2. sql

select 'g''day mate' qmarks from t1 union all
select 'beavers'' teeth'    from t1 union all
select ''''                 from t1

4. 统计字符出现的次数

4.1. 10,CLARK,MANAGER

4.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             800
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300

5.2. sql

ENAME      STRIPPED1         SAL STRIPPED2
--------- ---------- ---------- ---------
SMITH      SMTH              800 8
ALLEN      LLN              1600 16
WARD       WRD              1250 125
JONES      JNS              2975 2975
MARTIN     MRTN             1250 125
BLAKE      BLK              2850 285
CLARK      CLRK             2450 245
SCOTT      SCTT             3000 3
KING       KNG              5000 5
TURNER     TRNR             1500 15
ADAMS      DMS              1100 11
JAMES      JMS               950 95
FORD       FRD              3000 3
MILLER     MLLR             1300 13

5.3. DB2

5.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. Oracle

5.5. PostgreSQL

5.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. MySQL

5.8. SQL Server

5.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
---------------
SMITH800
ALLEN1600
WARD1250
JONES2975
MARTIN1250
BLAKE2850
CLARK2450
SCOTT3000
KING5000
TURNER1500
ADAMS1100
JAMES950
FORD3000
MILLER1300

6.2. DB2

6.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. Oracle

6.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. PostgreSQL

6.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
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

7.2. DB2

7.3. Oracle

7.4. PostgreSQL

7.5. MySQL

7.6. 使用内置函数LENGTH和SUBSTR

7.6.1.  sql

select ename
   from emp
  order by substr(ename,length(ename)-1,2)

7.7. SQL Server

7.7.1. sql

select ename
  from emp
 order by substring(ename,len(ename)-1,2)

8. 根据字符串里的数字排序

8.1. sql

DATA
-----------------------------
CLARK   7782 ACCOUNTING
KING    7839 ACCOUNTING
MILLER  7934 ACCOUNTING
SMITH   7369 RESEARCH
JONES   7566 RESEARCH
SCOTT   7788 RESEARCH
ADAMS   7876 RESEARCH
FORD    7902 RESEARCH
ALLEN   7499 SALES
WARD    7521 SALES
MARTIN  7654 SALES
BLAKE   7698 SALES
TURNER  7844 SALES
JAMES   7900 SALES

8.2. DB2

8.2.1.  sql

select data
   from V
  order by
         cast(
      replace(
    translate(data,repeat('#',length(data)),
      replace(
    translate(data,'##########','0123456789'),
             '#','')),'#','') as integer)

8.3. Oracle

8.3.1.  sql

select data
   from V
  order by
         to_number(
           replace(
         translate(data,
           replace(
         translate(data,'0123456789','##########'),
                  '#'),rpad('#',20,'#')),'#'))

8.4. PostgreSQL

8.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
--------------
CL10AR
KI10NG
MI10LL
7369
7566
7788
7876
7902
ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES

9.2. DB2

9.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. Oracle

9.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. PostgreSQL

9.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. MySQL

9.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 as
select 'mo,larry,curly' as name
  from t1
 union all
select 'tina,gina,jaunita,regina,leena' as name
  from t1

10.2. sql

SUB
-----
larry
 gina

10.3. DB2

10.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. Oracle

10.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. PostgreSQL

10.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. MySQL

10.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 Server

10.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.4

11.2. sql

A     B     C     D
----- ----- ----- ---
111   22    3     4

11.3. DB2

11.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. Oracle

11.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. PostgreSQL

11.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. MySQL

11.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 Server

11.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提速计算机运行速度方法

提速计算机运行速度方法 1,首先看这一步情况运行负载是否很高,很高就容易产生迟钝!2,安装一个清理电脑空间的软件,深度清理的。3,点击这里,看开机自启动的软件有哪些,如下图所示。4&…

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法(Gold rush optimizer,GRO)由Kamran Zolf于2023年提出,其灵感来自淘金热,模拟淘金者进行黄金勘探行为。淘金优化算法(Gold rush optimizer,GRO)提…

logstash日志换行处理小解

logstash主用于日志实时数据收集、解析,并将数据转发的工具,内置的功能也相当强大。但,同时意味着,他可能接收到各种情况的数据。 此处,我们主要讲解我实际使用中,碰到的一个小问题,换行(\n)。…

斗轮机与程控站之间开关量双向无线通讯

斗轮堆取料机是一种对散料进行连续堆取作业的高效装卸大型机械,被广泛使用于火力发电厂和炼焦厂的输煤系统中。目前对斗轮机的技改主要为将斗轮机的部分程控信号改为无线传输,取代卷筒电机和电缆的应用。 多数情况下都是利用无线通讯做媒介,让工作人员通…

display 属性有哪些值,分别表示什么意思

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display 属性是什么?⭐ display 属性有哪些值?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

C# PDF加盖电子章

winform界面 1.选择加签pdf按钮代码实现 private void button1_Click(object sender, EventArgs e){OpenFileDialog op = new OpenFileDialog();op.Filter = "PDF文件(*.pdf)|*.pdf";bool flag = op.ShowDialog() == DialogResult.OK;if (flag){string pdfPath = P…

springboot+activiti+vue+mysql轻松搞定审批!

前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜。我这个快速开发平台在系统基础功能(用户管理,部门管理…)上整合了工…

HTTP代理编程:Python实用技巧与代码实例

今天我要与大家分享一些关于HTTP代理编程的实用技巧和Python代码实例。作为一名HTTP代理产品供应商,希望通过这篇文章,帮助你们掌握一些高效且实用的编程技巧,提高开发和使用HTTP代理产品的能力。 一、使用Python的requests库发送HTTP请求&a…

无涯教程-Perl - getpwnam函数

描述 此函数基于EXPR指定的用户名,从/etc/passwd文件提取的列表context中返回字段列表。通常这样使用- ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) getpwnam($user); 在标量context中,返回数字用户ID。如果尝试访问整个/etc/passwd文件,则应使用getpwent…

【从零学习python 】10.Python条件语句和if嵌套详解

文章目录 elif一、 elif的功能二、注意点if嵌套想一想: 一、if嵌套的格式二、if嵌套的应用为什么结果3和结果4相同??? 猜拳游戏运行效果:参考代码: if补充内容三、自动类型转换进阶案例 elif 如果有这样一种情况:当条件…

nginx(八十六)uri转义杂谈

一 关于nginx uri过往整理 HTTP1.1(四)URI HTTP1.1(五)URI编码 HTTP杂谈(三)URL特殊字符 以下涉及: 1) location 与$uri --> 路由匹配 --> 通过debug日志观察2) proxy_paas --> attach_url是否有,有是否是变量,决定透传给上游uri的形式3) $reque…

PDF能转CAD格式吗?学会这种方法轻松实现转换

PDF文件可以转换成CAD格式吗?答案是可以的,PDF格式在各种设备和软件上都有很好的兼容性,而CAD格式则是更加专业的CAD软件设计,将PDF转换为CAD格式可以确保在设计过程中不会出现无法编辑的现象,极大的提高工作效率&…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了,在网上找到资源就可以进行安装 需要注意的是:有的文件破解文件缺少,导致破解不成功。 能够新建地图就是成功了! geemap安装 1.需要进行环…

mac安装redis 配置密码

brew install redis 两个重要目录文件 /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf 配置文件默认是非守护进程运行redis 默认是不用密码验证,配置为开启密码验证 重启redis brew services restart redis 客户端调用 redis-cli 密码 …

浅谈绿色节约型校园电力能耗监控系统的设计与应用方案

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘 要:校园中能源的消耗与浪费占用了校园总费用支出的很大比例,而电能的消耗又是能源消耗的重中之重,重点阐述了校园能耗监控系统方案设计、关键技术。以北方某高校为例应用该方案&#x…

find命令用法及参数

find 命令是在 Linux 和 Unix 系统中用于查找文件的强大工具。它可以递归地在指定的目录和子目录中搜索符合条件的文件,并执行一些操作。 以下是 find 命令的一些常见用法和参数: 基本用法 查找指定名称的文件: find /path/to/directory …

最新SQLMap进阶技术

点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 五折购买链接:u.jd.com/3ibjeF6 SQLMap进阶:参数讲解 (1)--level 5:探测等级。 参数“--level 5”指需…

Vue组件化开发思想;Vue的全局组件;Vue的局部组件;Vue的开发模式和解析;Vue CLI安装和使用;Vue项目的创建方式–Vite

目录 1_Vue组件化开发思想1.1_认识组件化开发1.2_Vue的组件化1.3_注册组件的方式 2_Vue的全局组件3_Vue的局部组件4_Vue的开发模式和解析4.1_Vue的开发模式4.2_单文件的特点4.3_如何支持SFC4.4_VSCode对SFC文件的支持 5_Vue CLI安装和使用5.1_Vue CLI脚手架5.2_Vue CLI 安装和使…

CRM五大功能提高提高销售效率

如今,CRM是企业提高销售效率、转化更多客户的重要工具。市面上有许多CRM管理系统,推荐一款知名的CRM管理系统 1、简单易用 Zoho CRM的用户界面干净简洁,操作简单直观,无需复杂的配置和培训,即使没有IT基础的“小白”…

利用C++nlohmann库解析json文件

json文件示例&#xff1a; 代码运行环境VS2019 一、git下载nlohmann库文件源代码 源代码文件目录 二、利用VS2019新建工程&#xff0c;并配置项目属性 配置VC目录---包含目录 三、项目源代码 #include <iostream> #include <fstream> #include <nlohmann/jso…