db2 locate函数、position函数、posstr函数、字符串匹配函数

以下讲解一下db2中的字符串匹配函数。

一、locate函数

1.1、语法

语法:LOCATE(str_expr1,str_expr2[,start])

示例:查询user表中用户姓名包含王的数据
select * from user where locate('王',user_name) >0

返回str_expr1第一次在str_expr2中出现的位置,若给出第三个参数则表明从str_expr2的第start位开始搜索

注意:
1.位置下标默认从1开始,若未找到则返回0
2.locate中的两个参数,若任意一个参数为null,则返回null
3.若查找字符中包含中文,则返回位置可能不是真实位置(返回字节位置),需要加codeunits16处理

codeunits16相关知识参考:
https://www.ibm.com/docs/zh/db2/10.5?topic=sce-db2-cancun-release-string-unit-attributes-improve-handling-multibyte-characters

1.2、示例

1.2.1、查找英文字符

db2 => values LOCATE('c','abcd');

1
-----------
3

在这里插入图片描述

1.2.2、查找中文字符(注意有坑)

注意:若查询内容中包含了中文字符,需要在后面添加codeunits16,否则虽然能返回位置,但是返回的位置不对。

db2 => values LOCATE('中','我爱中国',codeunits16);

1
-----------
3

在这里插入图片描述

我们看一下上面这个语句若不加codeunits16会怎么样?
在这里插入图片描述
若不加codeunits16则默认返回的是字节的位置,可以通过length函数计算字节长度

db2 => values length('我爱',octets);

1
-----------
4   -- 可以发现我爱这两个字占了4个字节,所以中的位置是5

1.2.3、从指定位置查找

db2 => values LOCATE('中','我爱中国',2,codeunits16);

1
-----------
3

db2 => values LOCATE('中','我爱中国',4,codeunits16);

1
-----------
0  -- 从第4位开始查找的时候会返回0,因为查不到

1.2.4、locate参数中包含null (注意有坑)

我们用locate函数是希望查找指定内容,若查找不到则返回0的,但是需要注意的是也可能会返回null的情况

db2 => values LOCATE(null,'我爱中国',codeunits16);

1
-----------
null -- 注意:locate的前两个查询内容,若任意一个为null, 则返回null


上面我们测试了包含null的情况,那如果是空字符串''会怎么样呢?
db2 => values LOCATE('','我爱中国',codeunits16);

1
-----------
1 -- 注意:当查找内容是空字符串''的时候返回了1,这里也可能会导致踩坑,请注意

二、position函数

2.1、语法

语法:position(expr1,expr2)

返回expr1在expr2中第一次出现的起始位置,如果找不到子字符串,‌则返回0。
经测试,代码单元用octets也可以得到正确结果。

注意:
1.若第一个参数expr1为null则抛异常;若第二个参数expr2为null则返回null; 若第一个参数expr1为空字符串''则返回1

2.2、示例

2.2.1、查询包含中文

db2 => values position('中','我爱中国',codeunits16);

1
-----------
3

2.2.2、查询空内容(注意有坑)

这里我们测试一下当查询内容有null、空字符串’'的时候会怎么样?

db2 => values position(null,'我爱中国',codeunits16);

1
-----------
抛异常 -- 注意:当第一个参数查询内容为null时,数据库抛异常


db2 => values position('我',null,codeunits16);

1
-----------
null -- 注意:当第二个参数为null时,返回null

上面我们测试了包含null的情况,那如果是空字符串''会怎么样呢?
db2 => values position('','我爱中国',codeunits16);

1
-----------
1 -- 注意:当查找内容是空字符串''的时候返回了1,这里也可能会导致踩坑,请注意

三、posstr函数

3.1、语法

语法:posstr(source_str,search_str)

返回一个字符串(search_str)在另一个字符串(source_str)中第一次出现的起始位置。默认返回的是字节所在的位置。

注意:
1.posstr返回的是字节所在的位置,不支持返回真实字符所占位置

3.2、示例

3.2.1、查询字符所在位置

注意:posstr返回的是字节所在的位置,不支持返回真实字符所占位置

db2 => values posstr('我爱中国','中');

1
-----------
5

3.2.2、查询空内容(注意有坑)

注意:若有任意一个参数为null, 则返回null;若搜索内容为空字符串’'则返回1

db2 => values posstr('我爱中国',null);

1
-----------
null  -- 若有任意一个参数为null, 则返回null

db2 => values  posstr(null,'中') ;

1
-----------
null

db2 => values posstr('我爱中国','');

1
-----------
1 -- 当搜索内容是空字符串''时,返回1

四、locate、position、posstr的区别

主要区别如下:

  1. locate允许指定搜索的起始位置。‌其他两个不支持
  2. 三者对于null或空字符串的处理逻辑不太一样
  3. locate、position支持查询中文字符的位置,posstr只支持返回字节的位置
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DB2 SQL中,可以通过使用函数如concat、posstrlocate来实现行转列和列转行。 行转列: 假设有一个表格t,包含以下数据: ``` ╔═══════════╗ ║ 列名 ║ ╠═══════════╣ ║ 值1 ║ ║ 值2 ║ ║ 值3 ║ ╚═══════════╝ ``` 现在我们想要将这个表格的数据进行行转列,可以使用concat函数来实现。例如: ```sql SELECT CONCAT(t.值1, ',', t.值2, ',', t.值3) AS 列转行结果 FROM t; ``` 这将返回一个结果集,其中每个行都会将原来的值连接在一起,以逗号分隔,如下所示: ``` ╔════════════════════════╗ ║ 列转行结果 ║ ╠════════════════════════╣ ║ 值1, 值2, 值3 ║ ╚════════════════════════╝ ``` 列转行: 假设有一个表格t,包含以下数据: ``` ╔════════════════════════╦════════════════════════╦════════════════════════╗ ║ 值1 ║ 值2 ║ 值3 ║ ╠════════════════════════╬════════════════════════╬════════════════════════╣ ║ A ║ B ║ C ║ ╚════════════════════════╩════════════════════════╩════════════════════════╝ ``` 现在我们想要将这个表格的数据进行列转行,可以使用posstrlocate函数来实现。例如: ```sql SELECT SUBSTRING(t.值1, LOCATE(',', t.值1) + 1) AS 值 FROM t WHERE LOCATE(',', t.值1) <> 0 UNION SELECT t.值2 AS 值 FROM t UNION SELECT t.值3 AS 值 FROM t; ``` 这将返回一个结果集,其中每个行都包含原来每个列的值,如下所示: ``` ╔═════════╗ ║ 值 ║ ╠═════════╣ ║ B ║ ║ C ║ ║ A ║ ╚═════════╝ ``` 通过使用这些函数,可以很方便地实现行转列和列转行的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值