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:检查数字列是不是包含格式化数字字符串中的值的主要内容,如果未能解决你的问题,请参考以下文章