在用设备扫描后,我的包装箱上有条形码(01)18777777777777(15)241129(10)L3333333(90)02 0118777777777777152411291877777777777703F9002

在数据库中,我有一个小表barcode_settings

CODE NAME SIZE
01 GTIN 14
10 LOT -1 is variable length end is character F
15 Best Before Date (YYMMDD) 6
90 Total 2

有没有可能买到这样的:

my_func有两个参数P_STRINGP_CODE

从DUAL中 Select my_func(‘01187777777777771524112910L3333333F9002’,‘01’); 18777777777777

从DUAL中 Select my_func(‘01187777777777771524112910L3333333F9002’,‘10’); L3333333

从DUAL中 Select my_func(‘01187777777777771524112910L3333333F9002’,‘15’); 241129

推荐答案

这是可能的,但有一些限制,例如.

  • 条形码必须具有相同的格式,因为如果不是这样的话,就没有办法区分哪个是01,哪个是01.您的原始(在更改之前)示例条形码说明:

    01180120708010531524112910L2238415F9002
    --  --
    two 01 values; which of them is supposed to represent CODE value?
    
  • 代码必须紧跟在该示例中的一个后面:01、15、10、90;否则,您无法正确计算长度


SQL> create or replace function f_bc(par_string in varchar2, par_code in varchar2)
  2  return varchar2 is
  3    l_len_01 number;
  4    l_len_10 number;
  5    l_len_15 number;
  6    l_len_90 number;
  7    --
  8    l_01 varchar2(20);
  9    l_10 varchar2(20);
 10    l_15 varchar2(20);
 11    l_90 varchar2(20);
 12    retval varchar2(20);
 13  begin
 14    select csize into l_len_01 from barcode_settings where code = '01';
 15    select csize into l_len_10 from barcode_settings where code = '10';
 16    select csize into l_len_15 from barcode_settings where code = '15';
 17    select csize into l_len_90 from barcode_settings where code = '90';
 18
 19    l_01 := substr(par_string, 3, l_len_01);
 20    l_15 := substr(par_string, 2 + l_len_01 + 2 + 1, l_len_15);
 21    l_10 := substr(par_string,
 22                   2 + l_len_01 + 2 + l_len_15 + 2 + 1,
 23                   length(par_string) - (2 + l_len_01 + 2 + l_len_15 + 2 + 1 + 2 + l_len_90));
 24    l_90 := substr(par_string, -2);
 25
 26    retval := case when par_code = '01' then l_01
 27                   when par_code = '15' then l_15
 28                   when par_Code = '10' then l_10
 29                   when par_code = '90' then l_90
 30              end;
 31    return retval;
 32  end;
 33  /

Function created.

测试:

SQL> with test (barcode) as
  2    (select '01180120708010531524112910L2238415F9002' from dual)
  3  select f_bc(barcode, '01') v_01,
  4         f_bc(barcode, '15') v_15,
  5         f_bc(barcode, '10') v_10,
  6         f_bc(barcode, '90') v_90
  7  from test;

V_01            V_15   V_10       V_90
--------------- ------ ---------- -----
18012070801053  241129 L2238415   02

SQL>

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何在一个范围内进行分组.""范围值在范围表中定义

如果开始期间不存在PostgresSql回填数据

更新其组的日期字段值小于最大日期减go 天数的记录

按分隔符和总和分析字符串

如何隐藏聚合JSON数组元素的键

如何在SQL中从多个查询进行分组

SQL递归.硬币兑换问题.-try 使用递归解决硬币找零问题

如果另一个表中不存在值列,则插入失败

排除具有部分匹配条件的记录

SQL将三个表中的三列组合为一列

Snowflake 中的分层数据

根据标识符将两行合并为一行

不同计数的 Postgres PIVOT 表

如何修复初学者 SQL INNER JOIN 查询错误

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

每个ID的SQL返回可能的最低级别及其值

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?