zoukankan      html  css  js  c++  java
  • Oracle中的substr()函数和INSTR()函数和mysql中substring_index函数字符截取函数用法:计算BOM系数用量拼接字符串*计算值方法

    最近一直在研究计算产品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

    运行的结果:

  • 相关阅读:
    verilog 数组参数
    跨时钟域设计【一】——Slow to fast clock domain
    跨时钟域设计【二】——Fast to slow clock domain
    跨时钟域设计【三】—— 数据同步
    Vivado学习笔记_002
    使用modelsim仿真DDR3时编译出错的解决方法
    Modelsim仿真tcl脚本与wave.do文件
    %s 与 %0s在 verilog中的区别
    BFM1
    verilog 常用系统函数及例子
  • 原文地址:https://www.cnblogs.com/mylive/p/15759932.html
Copyright © 2011-2022 走看看