sql 语句系列(字符串的遍历嵌入删除与统计)[八百章之第十一章]

遍历字符串

我觉得首先要提出一个疑问:

一个数据库本身就是用于存储的,遍历字符串究竟有何意义?

先看如何实现的,毕竟sql service 是没有for循环,也没有loop和while的。

select SUBSTRING(e.ENAME,t.ID,1) as sub
from emp e,T10 t
where e.ENAME=‘JONES‘ and t.ID<=len(e.ENAME)

的确是遍历了这个字符串JONES.

原理也十分的简单:

select * from T10

T10 可以看成一个索引集,利用一个笛卡尔积的特性实现的。

加入不是去附加额外的条件:

select e.ENAME,t.ID

from emp e,T10 t

where e.ENAME=‘JONES‘

这就是它的一个简单原理。

回到业务层面,去数据库遍历一个字符串那么本身就不可以,因为数据库不是去计算层面的东西。

一般可用于用户的一些常规性,基本稳定的字段。

我们在查询一个记录的时候如果加上top 1,那么效率最高,因为不需要去遍历整张表。

所以比如用户的一些配置表示这样的:id(用户id) usersetting(某类用户特性).

举例而言:5 xxx,xxx,xxx,xxx,xxx,xxx

后面的xxx,xxx,xxx,xxx,xxx,xxx,是对应的另外一张表的主键,这张表的主键的id是生成的唯一id且长度相等。

那么就可以通过遍历的方式,查询出用户的具体特性。

下面这种:

select *
from xxx
where yy in
(select e.ENAME,t.ID

from emp e,T10 t

where e.ENAME=‘JONES‘ )

由于自己水平的限制,这是我唯一遇到的情况,其他的情况也没遇上过。希望有人可以补充更加实用的例子,在此等待学习。

嵌入引号

这里只是接受两个‘‘是一个引号,如果只有‘‘为空,有点绕,看例子。

select ‘g‘‘day mate‘  from t1

select ‘‘  from t1

统计字符串出现的个数

通常往往一定,我们用的是正则,但是又碰巧sql service没有正则,这就巧了。

网上有一些文章写sql service 使用正则的,都是基本通过通配符来实现的。

这个就不需要这么麻烦了。

select (len(‘xxxx,xxxx,xxxx‘)-len(REPLACE(‘xxxx,xxxx,xxxx‘,‘,‘,‘‘)))/len(‘,‘)
from T1

这个例子我第一个例子相对应。

删除不想要的字符

这个直接使用replace 函数替换即可,如果要替换几个,那么多次使用。例子参考上文。

在oracle 中可以使用 translate: replace(translate(‘你好啊 你好啊‘,"mm",‘你啊‘),‘m‘)

上文translate把"你" "啊" 全部换成了m,然后删除m即可。

translate 的第二个参数是每一位是和第三个参数的每一位相对应的。一个你,对应第一个m,第二个啊,对应第二个m,如果没有即为空。

在 sql service 2017以后:

select replace(translate(‘你好啊 你好啊‘,‘mm‘,‘你啊‘),‘m‘,‘‘)
from T1

分离数字和字符数据

和上面的一致,只是分离出数字后,需要用convert(int,‘xxx‘) 转换

select CONVERT(int,REPLACE(translate(‘dadsawx10‘,‘zzzzzzzzzzzzzzzzz‘,‘abcdefghijklmnopqrstuvwxyz‘),‘z‘,‘‘)) as number,REPLACE(translate(‘dadsawx10‘,‘0000000000‘,‘0123456789‘),‘0‘,‘‘) as str
from t1

原文地址:https://www.cnblogs.com/aoximin/p/12563551.html

时间: 2024-10-10 06:28:34

sql 语句系列(字符串的遍历嵌入删除与统计)[八百章之第十一章]的相关文章

SQliteDatabase 中sql语句引用字符串时的注意点,要把单引号放进去,E/SQLiteLog﹕ (1) no such column:

如下面所示:name是string型的,这样直接引用会出现错误提示: android.database.sqlite.SQLiteException: no such column: longman (code 1): , while compiling: insert into demo (name,age) values(longman,55) public void insertData(String name, int age) { db.execSQL("insert into dem

数据库的SQL语句创建和主外键删除操作

1 create table UserType 2 3 ( 4 5 Id int primary key identity(1,1), Name nvarchar(25) not null 6 7 ) go 1 create table UserInfo 2 3 ( 4 5 Id int primary key identity(1,1), LoginPwd varchar(50) not null, LoginName varchar(50) not null, Name varchar(25

ORACLE中通过SQL语句(alter table)来增加、删除、修改字段

1.添加字段: alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ; 2.添加备注: comment on column  库名.表名.字段名 is  '输入的备注';  如: 我要在ers_data库中  test表 document_type字段添加备注  comment on column ers_data.test.document_type is '文件类型'; 3.修改字段类型: alter

sql 语句系列(众数中位数与百分比)[八百章之第十五章]

众数 众数就是出现最多的那个数. select sal,count(*) as cnt from emp where DEPTNO=20 group by sal 通过分组把他们的行数计算出来.那么最关键的部分在于,你如何知道最大值. 是的我们可以查出当前最大值,然后再取出最大值的sal.但是这肯定要用到两个临时视图. 注:我们不能通过排序cnt,然后取值第一个,因为可能存在相同的行数. 解决方案:通过dense_rank 进行排序. 科普一下概念: row_number的用途非常广泛,排序最好

sql 语句系列(闰年)[八百章之第十九章]

前言 判断闰年还是挺有用的. mysql select DAY(LAST_DAY(DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+31 DAY))) as dy FROM T1 这个看起来有一点点复杂,其实拆开了还是很简单的. CURRENT_DATE 获取当前日期. DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+31 DAY) 当前的日期,减去了从1月1号经

sql语句截取字符串

case when left(t5.name,2)='20' then substring(t5.name,9,2) else substring(t5.name,7,2) end GD 截取前1-10位数字 ac17072408 select substring(name,0,11) from profin_application; name=ac1707240801 select substring(name,0,11) from profin_application; select  le

用sql语句处理字符串以逗号截开分别获取值

QH如果是  数据1,数据2,数据3 select substring(QH,1,(charindex(',',QH)-1)) from UNSET_JJYXJB_INFO      获得的值是  数据1 select substring(QH,charindex(',',QH)+1,charindex(',',QH,charindex(',',QH)+1)-charindex(',',QH)-1) from UNSET_JJYXJB_I   获得的值是  数据2

sql 语句系列(行与列处理)[八百章之第一章]

排序时对null进行处理 比如说: select * from EMP order by COMM 我需要对红框部分进行desc处理,也就是从大到小排列. 解析: 重点是如何让null独立出去. select * from (select *,case when COMM is null then 0 else 1 end as COMMISNULL from EMP ) x order by COMMISNULL,COMM desc 解法:单独列出一列把null独立出去. 注意null的判断是

sql 语句系列(null 值处理)[八百章之第二章]

查找只存在一个表中的数据 有两张表: EMP: select * from emp DEPT: 他们有共同的属性:deptno 现在要查询EMP 中的deptno不等于DEPTNO的deptno项. 解析: select distinct DEPTNO from EMP where DEPTNO not in ( select DEPTNO from DEPT ) 注意: 因为需要查询的是DEPTNO,所以需要排除掉重复项. 其次上面的写法,如果DEPTNO在DEPT有null项上面的是错误的.