Oracle:检查数字列是否包含格式化数字字符串

时间:2017-06-23 16:25:32

标签: database string oracle plsql oracle-sqldeveloper

在我的本地表中,我尝试检查名为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')并且找不到它,因此它不返回任何值。该字符串每次都包含不同的值,并且该字符串中将包含多个(字符串类型)数字。

有谁知道怎么做?

1 个答案:

答案 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;