最近一直在研究计算产品BOM的成本系数,将拼接的元件用量拼接后拆分计算是个问题,后来受到大佬在mysql中截取字符串的启发在oracle中以substr和instr实现了

 1.以下是我在mysql中重写的代码 

mysql中使用substring_index

SUBSTRING_INDEX(str, delimiter, count)

返回一个 str 的子字符串,在 delimiter 出现 count 次的位置截取。

如果 count > 0,从则左边数起,且返回位置前的子串;

如果 count < 0,从则右边数起,且返回位置后的子串。

delimiter 是大小写敏感,且是多字节安全的。

取头字符串方法substring_index(gs, '*', 1)

取尾字符串方法substring_index(gs, '*', -1)

取中间字符串方法substring_index(substring_index(gs, '*', 3), '*', -1)

#1.创建测试数据
create table testgs3 as
select '1.1*4.52*1.1' gs
union all
select '2.5*4.5*1.5*2.2' x1
union all
select '1.0' x1
union ALL
select '2*.5*2.5';
#2.按测试数据进行截取计算
select gs,
how,
case
when how = 0 then gs
when how = 1 then substring_index(gs,'*', 1) *substring_index(gs,'*', -1)
when how = 2 then
substring_index(gs, '*', 1) * substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(gs, '*', -1)
when how = 3 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) * substring_index(substring_index(gs, '*', 3),'*', -1) * substring_index(gs, '*' ,- 1)
when how = 4 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1) * substring_index(gs, '*', -1)
when how = 5 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1)
*substring_index(substring_index(gs, '*', 5), '*', -1)* substring_index(gs, '*', -1)
when how = 6 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1)
*substring_index(substring_index(gs, '*', 5), '*', -1)*substring_index(substring_index(gs, '*', 6), '*', -1)* substring_index(gs, '*', -1)
when how = 7 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1)
*substring_index(substring_index(gs, '*', 5), '*', -1)*substring_index(substring_index(gs, '*', 6), '*', -1)* substring_index(substring_index(gs, '*', 7), '*', -1)*substring_index(gs, '*', -1)
when how = 8 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1)
*substring_index(substring_index(gs, '*', 5), '*', -1)*substring_index(substring_index(gs, '*', 6), '*', -1)* substring_index(substring_index(gs, '*', 7), '*', -1)
*substring_index(substring_index(gs, '*', 8), '*', -1)*substring_index(gs, '*', -1)
when how = 9 then
substring_index(gs, '*', 1) *substring_index(substring_index(gs, '*', 2), '*', -1) *substring_index(substring_index(gs, '*', 3), '*', -1) *substring_index(substring_index(gs, '*', 4), '*', -1)
*substring_index(substring_index(gs, '*', 5), '*', -1)*substring_index(substring_index(gs, '*', 6), '*', -1)* substring_index(substring_index(gs, '*', 7), '*', -1)
*substring_index(substring_index(gs, '*', 8), '*', -1)*substring_index(substring_index(gs, '*', 9), '*', -1)*substring_index(gs, '*', -1)
end jg
from (select gs, (length(replace(gs, '*', '--')) - length(gs)) how
from testgs3)b

以下是运行后结果:

2.以下是我在ORACLE中实现字符串截取的方法:

ORACLE中使用SUBSTR和INSTR组合

1)substr函数格式   (俗称:字符截取函数)

  格式1: substr(string string, int a, int b);

  格式2:substr(string string, int a) ;

解释:

格式1:
        1、string 需要截取的字符串 
        2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
        3、b 要截取的字符串的长度

    格式2:
        1、string 需要截取的字符串
        2、a 可以理解为从第a个字符开始截取后面所有的字符串。

----创建测试数据

CREATE TABLE TESTGS AS

(SELECT '1.1*4*.1' GS FROM DUAL
UNION ALL
SELECT '2*1.1*1*2' X1 FROM DUAL
UNION ALL
SELECT '1' X1 FROM DUAL)

----拆分组成用量*的字符串lms220103

SELECT GS,

INSTR(GS, '*', 1, 1) N_FIRST,
INSTR(GS, '*', 1, 2) N_LAST,
INSTR(GS, '*', 1, 3) N_MIDDLE,
NVL(SUBSTR(GS, 0, INSTR(GS, '*', 1, 1) - 1), GS) N_FIRST_VALUE1,
NVL(SUBSTR(GS, -1, INSTR(GS, '*', -1, 1) + 1),1) N_LAST_VALUE,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 2) - 1), -1),1) N_MIDDLE_VALUE2,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 3) - 1), -1),1) N_MIDDLE_VALUE3,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 4) - 1), -1),1) N_MIDDLE_VALUE4,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 5) - 1), -1),1) N_MIDDLE_VALUE5,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 6) - 1), -1),1) N_MIDDLE_VALUE6,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 7) - 1), -1),1) N_MIDDLE_VALUE7,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 8) - 1), -1),1) N_MIDDLE_VALUE8,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 9) - 1), -1),1) N_MIDDLE_VALUE9,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 10) - 1), -1),1) N_MIDDLE_VALUE10
FROM (SELECT GS, (LENGTH(REPLACE(GS, '*', '00')) - LENGTH(GS)) HOW
FROM TESTGS)

实施:

----拆分组成用量*的字符串lms220103
WITH V_GS AS (SELECT GS,HOW,
INSTR(GS, '*', 1, 1) N_FIRST,
INSTR(GS, '*', 1, 2) N_LAST,
INSTR(GS, '*', 1, 3) N_MIDDLE,
NVL(SUBSTR(GS, 0, INSTR(GS, '*', 1, 1) - 1), GS) N_FIRST_VALUE1,
NVL(SUBSTR(GS, -1, INSTR(GS, '*', -1, 1) + 1),1) N_LAST_VALUE,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 2) - 1), -1),1) N_MIDDLE_VALUE2,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 3) - 1), -1),1) N_MIDDLE_VALUE3,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 4) - 1), -1),1) N_MIDDLE_VALUE4,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 5) - 1), -1),1) N_MIDDLE_VALUE5,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 6) - 1), -1),1) N_MIDDLE_VALUE6,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 7) - 1), -1),1) N_MIDDLE_VALUE7,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 8) - 1), -1),1) N_MIDDLE_VALUE8,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 9) - 1), -1),1) N_MIDDLE_VALUE9,
NVL(SUBSTR(SUBSTR(GS, 0, INSTR(GS, '*', 1, 10) - 1), -1),1) N_MIDDLE_VALUE10
FROM (SELECT GS, (LENGTH(REPLACE(GS, '*', '00')) - LENGTH(GS)) HOW
FROM TESTGS))
SELECT GS,
HOW,
(CASE
WHEN HOW = 0 THEN
GS
WHEN HOW = 1 THEN to_char(N_FIRST_VALUE1*N_LAST_VALUE)
WHEN HOW = 2 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_LAST_VALUE)
WHEN HOW = 3 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_LAST_VALUE)
WHEN HOW = 4 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_LAST_VALUE)
WHEN HOW = 5 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_LAST_VALUE)
WHEN HOW = 6 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_MIDDLE_VALUE6*N_LAST_VALUE)
WHEN HOW = 7 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_MIDDLE_VALUE6*N_MIDDLE_VALUE7*N_LAST_VALUE)
WHEN HOW = 8 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_MIDDLE_VALUE6*N_MIDDLE_VALUE7*N_MIDDLE_VALUE8*N_LAST_VALUE)
WHEN HOW = 9 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_MIDDLE_VALUE6*N_MIDDLE_VALUE7*N_MIDDLE_VALUE8*N_MIDDLE_VALUE9*N_LAST_VALUE)
WHEN HOW = 10 THEN to_char(N_FIRST_VALUE1*N_MIDDLE_VALUE2*N_MIDDLE_VALUE3*N_MIDDLE_VALUE4*N_MIDDLE_VALUE5*N_MIDDLE_VALUE6*N_MIDDLE_VALUE7*N_MIDDLE_VALUE8*N_MIDDLE_VALUE9*N_MIDDLE_VALUE10*N_LAST_VALUE)
else '请联系开发更新代码'
END) JG
FROM V_GS

运行的结果:

Oracle中的substr()函数和INSTR()函数和mysql中substring_index函数字符截取函数用法:计算BOM系数用量拼接字符串*计算值方法的更多相关文章

  1. Oracle substr() 字符截取函数

    1.substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...

  2. MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。

    MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.

  3. Sql Server中的nvarchar(n)、varchar(n) 和Mysql中的char(n)、varchar(n)

    刚才有幸看了下 nvarchar(n)和varchar(n),感觉以前的认知有误. nvarchar(n):n指的是字符个数,范围是1-4000,存储的是可变长度的Unicode字符数据. 按字符存储 ...

  4. mysql 字段包含某个字符的函数

    通过sql查询语句,查询某个字段中包含特定字符串: 例子:查询e_book表的types字段包含字符串"3",有下面4种方式 select * from e_book where ...

  5. EL中拼接字符串的方法

    近期在项目中碰到一个需要在JSP页面中比较两String类型的值的问题,于是想当然的写了如下代码: <c:if test="${'p'+longValue=='p1'}"&g ...

  6. Oracle中的substr()函数 详解及应用

    注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, ...

  7. Oracle中的substr()函数详解案例

    1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...

  8. JavaScript中字符串截取函数slice()、substring()、substr()

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...

  9. 数据库Oracle字符处理函数

    练习字符处理函数(数据库表都是从1开始),我们用到一张"伪表" dual: dual 表:dual 是一张只有一个字段,一行记录的表.dual 表也称之为'伪表',因为他不存储主题 ...

  10. MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数

    移植sql server 的存储过程到mysql中,遇到了sql server中的: IF @@ROWCOUNT < 1 对应到mysql中可以使用 FOUND_ROWS() 函数来替换. 1. ...

随机推荐

  1. Python异步编程之web框架 异步vs同步 Redis并发对比

    测试基本信息 主题:比较异步框架和同步框架在RedisIO操作的性能差异 python版本:python 3.8 数据库:redis 5.0.7 压测工具:locust web框架:同步:flask ...

  2. 通过模仿学会Python爬虫(一):零基础上手

    好家伙,爬虫来了 爬虫,这玩意,不会怎么办, 诶,先抄一份作业回来 1.别人的爬虫  Python爬虫史上超详细讲解(零基础入门,老年人都看的懂)_ChenBinBini的博客-CSDN博客 # -* ...

  3. kafka学习笔记03消息队列的两种模式

     ①点对点模式   该种模式就是消费者会自动消费消息,消息收到之后会向消息队列进行确认收到消息,然后将该数据进行删除.  ②发布/订阅模式   可以有多个的topic,topic在英语中有主题的意思, ...

  4. 前端Vue自定义简单通用省市区选择器picker地区选择器picker 收获地址界面模版

    前端Vue自定义简单通用省市区选择器picker地区选择器picker 收获地址界面模版,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin ...

  5. Flex布局常用属性详解

    1. Flex布局与响应式布局 1.1 为什么需要响应式布局? 在电脑PC端,使用浮动,定位同时使用像素px单位就可以完成大部分布局,而且布局完之后不会有大问题,但是到了移动端,移动设备的屏幕尺寸多种 ...

  6. SVE学习记录- SVE特性以及寄存器

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/SVE_learn_0.html SVE对比NEON有几个新增的地方. 变长的向量 支持Gather-load & ...

  7. 路由分发admin源码

    1. 不使用include方法 1.表象 另一种路由编写方式,不用使用include 引出namespace概念 可以看到如果使用include方法,后面可带上一个参数赋值给namespace 在无n ...

  8. Jedis 参数异常引发服务雪崩案例分析

    作者:vivo 互联网服务器团队 - Wang Zhi Redis 作为互联网业务首选的远程缓存工具而被大面积使用,作为访问客户端的 Jedis 同样被大面积使用.本文主要分析 Redis3.x 版本 ...

  9. .NET程序的 GDI句柄泄露 的再反思

    一:背景 1. 讲故事 上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋 ...

  10. Nginx:client_body_temp_path 指令的上传文件测试

    结论 硬盘必须要有上传文件3倍大小的剩余空间.否则会报错"no space left on device". 需要注意,这3份数据都会写到硬盘.大文件上传,实时观察硬盘剩余空间wa ...