在我的本地表中,我尝试检查名为JOBNUMBER的Oracle Number列是否具有字符串参数中存在的值。从技术上讲,我将字符串作为存储过程nvarchar2参数传递,但为了简单起见,我在下面的查询中对字符串进行了硬编码:
SELECT FIRST_NAME, JOB_NUMBER
FROM JOBTABLE
WHERE TO_CHAR(JOB_NUMBER) IN ('00052, 00048');
当Oracle运行上面的查询时,即使00052是JOB_NUMBER的表列中的数字值,它也不返回任何值。我认为它在JOB_NUMBER中检查整个字符串('00052,00048')并且找不到它,因此它不返回任何值。该字符串每次都包含不同的值,并且该字符串中将包含多个(字符串类型)数字。
有谁知道怎么做?
答案 0 :(得分:0)
诀窍是在与字符串比较时保持数字的前导零,然后循环遍历字符串进行比较。这里使用的CTE是模拟创建数字作业编号和要搜索的字符串。 TO_CHAR函数确保保留前导零,FM格式删除TO_CHAR为符号留下的前导空格。 CONNECT BY循环遍历分隔符计数的元素+ 1次,将值保持在'LEVEL'中。此值在REGEXP_SUBSTR中用于迭代元素,以将转换后的数值与每个元素进行比较,以查看是否找到匹配项。请注意,如果您需要知道列表中的哪个项目是您的匹配项,则此正则表达式允许使用NULL元素。
SQL> with tbl(job_nbr_in, job_str_in) as (
select 00052, '00052, 00048' from dual
)
select --level element_nbr,
to_char(job_nbr_in, 'FM00000') search_for, job_str_in in_string,
regexp_substr(job_str_in, '(.*?)(, |$)', 1, level, NULL, 1) found
from tbl
where to_char(job_nbr_in, 'FM00000') = regexp_substr(job_str_in, '(.*?)(, |$)', 1, level, NULL, 1)
connect by level <= regexp_count(job_str_in, ',')+1;
SEARCH_FOR IN_STRING FOUND
---------- ------------ ------------
00052 00052, 00048 00052
如果您不确定逗号后面是否总是有空格,请使用REPLACE删除空格并调整REGEXP_SUBSTR中的分隔符:
with tbl(job_nbr_in, job_str_in) as (
select 00052, '00052, 00048' from dual
)
select to_char(job_nbr_in, 'FM00000') search_for, job_str_in in_string,
regexp_substr(replace(job_str_in, ' '), '(.*?)(,|$)', 1, level, NULL, 1) found
from tbl
where to_char(job_nbr_in, 'FM00000') = regexp_substr(replace(job_str_in, ' '), '(.*?)(,|$)', 1, level, NULL, 1)
connect by level <= regexp_count(job_str_in, ',')+1;