如何解决Oracle SQL-如果value是多选参数中任何字符串的子字符串
假设您有一个参数:p_companys
,该参数是可以选择的值列表:
-----------
| company |
-----------
| 50 - ar |
| 55 - ag |
| 62 - hh |
| 70 - nr |
-----------
现在说用户从此列表中选择50 - ar
和55 - ag
作为其值。现在,该参数是这两个值的列表。
在我们的SQL查询中,我们使用公司编号并检查它们是否包含在此参数中。公司编号是前两位数字(分别为50和55)。是否可以执行以下操作:
select comp -- 50 and 55
from companies
where comp in :p_companys
但我们没有与整个列表中的整个字符串进行比较,而是与前x
个字符进行比较(是否需要参数中包含所有值的子字符串?)
解决方法
假设您输入选择中的参数数量不确定,我认为您需要结合使用regexp
和connect by level
类似的事情应该可以解决问题
with t as
(
SELECT regexp_substr(:p_companys,'[^,]+',1,level) as mycol FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT(:p_companys,'[,]')+1
) select comp from companies
where comp in ( select mycol from t )
;
示例
SQL> create table t ( c1 varchar2(1) ) ;
Table created.
SQL> insert into t values ( 'A' );
1 row created.
SQL> insert into t values ( 'B' );
1 row created.
SQL> insert into t values ( 'C' );
1 row created.
SQL> select * from t ;
C
-
A
B
C
现在,让我们测试输入变量何时为字符串列表
with x as
(
SELECT regexp_substr('A,B,C',level) as mycol FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT('A,]')+1
) select * from t where c1 in ( select mycol from x )
;
C
-
A
B
C
,
您需要将其放在WHERE子句中。
如果期望2位数字,则可以使用regexp,如下所示:
REGEXP_SUBSTR(comp,'\d\d') in ('50','55')
或者,如果您只想从字符串中切除前两个字符:
SUBSTR(comp,2) in ('50','55')
好吧,事实证明,在处理列表时,您不必在Oracle中仅使用一行。您可以使用两行,而我发现这样做的话,第二行被视为传递给SQL的值。第一行被视为显示给用户的值。这样您就可以得到这样的列表:
$my_query->max_num_pages
用户将看到在菜单选择中传递的列---------------------------
| comp_desc | comp |
---------------------------
| 50 - retail | 50 |
. . . . . . . . . . . . .
| 90 - lodging | 90 |
的值,但是SQL查询将通过comp_desc
的值获得comp
列的值。
因此,使用此设置,我们可以简单地使用:p_company
(请注意,此处需要使用括号)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。