我有两列带有主题分隔值的列,即Email#Web#Telephone#SMS#MMS
& 0#0#0#1#0
请注意,第二列的每个分隔值与第一列中对应的分隔值匹配,即Email = 0
,Web = 0
,Telephone = 0
,SMS = 1
等等
根据参数,我想返回第二列的匹配值。即传入参数= Web#Telephone#SMS
,因此我想要返回的值为0#0#1
。
这需要在PL SQL中完成,我不知道从哪里开始,这解释了缺少示例代码。
请帮忙吗?
答案 0 :(得分:2)
在Oracle软件包中有一些非常有用的实用程序函数,名为APEX_UTIL。 (此软件包涉及Oracle Application Express aka APEX,但可以在任何地方使用)。他们是:
使用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