Oracle:检查数字列是不是包含格式化数字字符串中的值

Posted

技术标签:

【中文标题】Oracle:检查数字列是不是包含格式化数字字符串中的值【英文标题】:Oracle: Check if number column contains a value from a formatted string of numbersOracle:检查数字列是否包含格式化数字字符串中的值 【发布时间】:2017-06-23 16:25:31 【问题描述】:

在我的本地表中,我尝试检查名为 JOBNUMBER 的 Oracle 编号列是否具有存在于字符串参数中的值。从技术上讲,我将字符串作为存储过程 nvarchar2 参数传递,但为简单起见,我在下面的查询中对字符串进行了硬编码:

SELECT FIRST_NAME, JOB_NUMBER
FROM JOBTABLE
WHERE TO_CHAR(JOB_NUMBER) IN ('00052, 00048');

当 Oracle 运行上述查询时,即使 00052 是 JOB_NUMBER 表列中的数字值,它也不返回任何值。我在想它会检查 JOB_NUMBER 中的整个字符串 ('00052, 00048') 并且找不到它,所以它不返回任何值。该字符串每次都会包含不同的值,并且该字符串中会有多个数字(字符串类型)。

有人知道怎么做吗?

【问题讨论】:

JOB_NUMBER 列使用哪种数据类型? 显然SELECT FIRST_NAME, JOB_NUMBER FROM JOBTABLE WHERE TO_CHAR(JOB_NUMBER) IN ('00052', '00048') 您想要检查作业编号是否为 `in('00052', '00048') - 两个不同字符串的列表。你传入的是一长串。你现在明白为什么这不起作用了吗?那么:字符串参数中的逗号后面真的有空格吗?这很奇怪。然后 - 今天早上其他人刚刚发布了几乎相同的问题;环顾四周,我在该线程中解释了解决此问题的标准方法。 即使我没有空间,我也想在一个长字符串中搜索数字。请告诉我该怎么做。 How to apply filter on comma separated values in oracle?的可能重复 【参考方案1】:

诀窍是在与字符串比较时保持数字的前导零,然后循环遍历字符串进行比较。这里使用 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;

【讨论】:

以上是关于Oracle:检查数字列是不是包含格式化数字字符串中的值的主要内容,如果未能解决你的问题,请参考以下文章

Arrayformula 检查列是不是包含文本并拉出旁边的数字。谷歌表格

检查列是不是包含类型字符串(对象)

Oracle 查询 ORA-01722

sqlplus中设定行大小页大小字符列格式数字列格式清屏

检查字符串是不是包含字母数字

检查字符串是不是仅包含数字