比较两个分隔的字符串并返回PL SQL

时间:2015-07-14 10:17:26

标签: sql oracle plsql

我有两列带有主题分隔值的列,即Email#Web#Telephone#SMS#MMS& 0#0#0#1#0请注意,第二列的每个分隔值与第一列中对应的分隔值匹配,即Email = 0Web = 0Telephone = 0SMS = 1等等 根据参数,我想返回第二列的匹配值。即传入参数= Web#Telephone#SMS,因此我想要返回的值为0#0#1

这需要在PL SQL中完成,我不知道从哪里开始,这解释了缺少示例代码。

请帮忙吗?

2 个答案:

答案 0 :(得分:2)

在Oracle软件包中有一些非常有用的实用程序函数,名为APEX_UTIL。 (此软件包涉及Oracle Application Express aka APEX,但可以在任何地方使用)。他们是:

  • apex_util.string_to_table
  • apex_util.table_to_string

使用string_to_table,您可以将分隔的字符串转换为值表:

declare
   v_table apex_application_global.vc_arr2; -- This is the table type apex_util uses
begin
   v_table := apex_util.table_to_string ('Email#Web#Telephone#SMS#MMS', '#');
end;

您现在拥有一个包含5个元素的数组('电子邮件','网络','电话','短信',&# 39; MMS&#39);

您可以对值字符串执行相同操作以获取包含元素的表格(' 0',' 0',' 0',' 1',0')。您也可以使用参数来获取包含元素的表格(' Web','电话','短信')。

然后,您可以使用PL / SQL逻辑构建一个新数组,其中包含您需要返回的值的元素,即(' 0',' 0',' 1&#39)。我把这部分留给你了!

最后,您可以将其转换为带分隔符的字符串:

return apex_util.table_to_string (v_return_table, '#');

答案 1 :(得分:2)

首先,您应该规范化表格,并在单个列中使用不同的而不是分隔字符串

无论如何,您可以使用Split comma delimited strings in a table

的技术以多种方式完成此操作

例如,使用 REGEXP_SUBSTR CONNECT BY 子句:

SQL> WITH DATA(attr, val) AS(
  2  SELECT 'Email#Web#Telephone#SMS#MMS', '0#0#0#1#0' FROM dual
  3  )
  4  SELECT lines.COLUMN_VALUE,
  5    trim(regexp_substr(t.attr, '[^#]+', 1, lines.COLUMN_VALUE)) attr,
  6    trim(regexp_substr(t.val, '[^#]+', 1, lines.COLUMN_VALUE)) val
  7  FROM data t,
  8    TABLE (CAST (MULTISET
  9    (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.attr, '#')+1
 10    ) AS sys.odciNumberList ) ) lines
 11  /

COLUMN_VALUE ATTR                        VAL
------------ --------------------------- ---------
           1 Email                       0
           2 Web                         0
           3 Telephone                   0
           4 SMS                         1
           5 MMS                         0

SQL>

现在,您可以获取每个属性的相应值。

您可以将整个逻辑放在 FUNCTION 中,并返回每个属性的相应值,并在 SELECT 语句中调用该函数。

例如,

SQL> CREATE OR REPLACE
  2    FUNCTION get_val_from_attr(
  3        attr_name VARCHAR2)
  4      RETURN NUMBER
  5    IS
  6      var_val NUMBER;
  7    BEGIN
  8    WITH DATA(attr, val) AS
  9      ( SELECT 'Email#Web#Telephone#SMS#MMS', '0#0#0#1#0' FROM dual
 10      ),
 11      t2 AS
 12      (SELECT lines.COLUMN_VALUE,
 13        trim(regexp_substr(t.attr, '[^#]+', 1, lines.COLUMN_VALUE)) attr,
 14        trim(regexp_substr(t.val, '[^#]+', 1, lines.COLUMN_VALUE)) val
 15      FROM data t,
 16        TABLE (CAST (MULTISET
 17        (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.attr, '#')+1
 18        ) AS sys.odciNumberList ) ) lines
 19      )
 20    SELECT val INTO var_val FROM t2 WHERE attr = attr_name;
 21    RETURN var_val;
 22  END;
 23  /

Function created.

我们打电话给功能

SQL> SELECT get_val_from_attr('Email') FROM dual;

GET_VAL_FROM_ATTR('EMAIL')
--------------------------
                         0

SQL> SELECT get_val_from_attr('SMS') FROM dual;

GET_VAL_FROM_ATTR('SMS')
------------------------
                       1