在oracle数据库表中,我需要查找给定批号的结果。保存批号的字段是一个包含“ 1-3,5,10-15,20”之类的字符串(此字符串内的数字已排序)
有没有办法做到这一点?
在上面的示例中,应该找到以下批号的结果:
1,2,3,5,10,11,12,13,14,15,20
在应用程序中无法做到这一点,因此必须在数据库内部完成。
类似于:“ SELECT * FROM产品的批次= 2”
通过使用REGEXP_SUBSTR函数和分层查询,可以在SQL中完成所有这些操作:
with list_of_ids as (
select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
, nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
, regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
from dual
connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
)
)
select a.*
from products a
join list_of_ids b
on a.lot between b.lot1 and b.lot2
但是,我必须强调,正确规范数据库是正确的方法。该解决方案可能无法很好地扩展,并且会进行大量不必要的工作。
它是这样的:
首先用逗号分割数据:
SQL> select regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) as a
2 from dual
3 connect by regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) is not null
4 ;
A
--------------
1-3
5
10-15
20
接下来,在最终将其连接到表之前,在连字符上拆分它以提供在BETWEEN中使用的最小和最大手数。NVL可以确保始终保持最大值。
SQL> select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
2 , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
3 , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
4 from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
5 from dual
6 connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
7 )
8 ;
LOT1 LOT2
-------------- --------------
1 3
5 5
10 15
20 20
SQL>
这是带有完整查询的有效SQL Fiddle。
问题内容: 我对和都错了。我想检查哈希是否仅包含数字。我错过了什么? 问题答案: 应该这样做。原始匹配的任何内容都只包含一位数字。
问题内容: 这是我的代码,以确定一个单词是否包含任何非字母数字字符: 我想知道正则表达式是否错误。我知道会匹配任何非单词字符。关于我所缺少的任何想法? 问题答案: 将您的正则表达式更改为:
从学习Java的第一天起,各种网站和许多老师就告诉我,数组是连续的内存位置,可以存储指定数量的相同类型的数据。 由于数组是一个对象,对象引用存储在堆栈上,而实际对象位于堆中,因此对象引用指向实际对象。 但是当我遇到如何在内存中创建数组的示例时,它们总是显示如下内容: (其中对数组对象的引用存储在堆栈上,并且该引用指向堆中的实际对象,其中还有指向特定内存位置的显式索引) 但是最近我在网上看到了Jav
我试图在ElasticSearch中运行类似的字段查询:
问题内容: 我有字符串,我想检查它的内容是否包含中文字符(是/否) 你能帮我么? 谢谢!阿德里安 问题答案: 您可以使用Unicode字符类http://www.regular- expressions.info/unicode.html 这只是检查是否存在至少一个汉字。如果要匹配完整的字符串,则可能需要对此进行扩展。