首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文,REGEXP_LIKE

甲骨文,REGEXP_LIKE
EN

Stack Overflow用户
提问于 2016-04-26 09:55:37
回答 2查看 691关注 0票数 2

我有一张有数据的桌子:

代码语言:javascript
复制
43  SQL Developer   2016-04-25/14:15:18
43  SQL Developer   2016-04-25/14:11:41
43  SQL Developer   2016-04-26/11:11:11

我只想显示日期为25.04的行。我是regexp的新手,这个字符字符串像[]][]/。总是惹恼我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 20:16:52

我的第一个倾向是做日期操作,但是由于这个问题是以REGEXP_LIKE的形式提出的,所以我假设OP想使用字符串操作:

将第3列转换为日期,然后提取月份=4和日期=25的位置:

代码语言:javascript
复制
with tbl(col1, col2, col3) as (
  select 43, 'SQL Developer', to_date('2016-04-25/14:15:18', 'YYYY-MM-DD/HH24:MI:SS') from dual union
  select 43, 'SQL Developer', to_date('2016-04-25/14:11:41', 'YYYY-MM-DD/HH24:MI:SS') from dual union
  select 43, 'SQL Developer', to_date('2016-04-26/11:11:11', 'YYYY-MM-DD/HH24:MI:SS') from dual
)
select col1, 
       col2,
       col3
from tbl
where EXTRACT(month FROM col3 ) = 4
and EXTRACT(day FROM col3 ) = 25; 

使用REGEXP_LIKE:

代码语言:javascript
复制
with tbl(col1, col2, col3) as (
  select 43, 'SQL Developer', '2016-04-25/14:15:18' from dual union
  select 43, 'SQL Developer', '2016-04-25/14:11:41' from dual union
  select 43, 'SQL Developer', '2016-04-26/11:11:11' from dual
)
select col1, 
       col2,
       col3
from tbl
where regexp_like(col3, '04-25\/');    

这在很大程度上假设了存储在varchar2中的日期/时间列(可以说是个坏主意)。它总是以这种格式,不是NULL,分隔符总是斜杠,如果输入来自其验证和擦除的屏幕形式,以确保它与此格式相匹配,等等。您可能需要在日期/时间列上搜索意外格式,以确保您确实知道正在处理的是什么。因为它是一个varchar2,所以您真的无法确定(数据类型中存储日期的问题之一)。

我强烈建议您将此日期/时间存储在适当的日期列中,如果您有此权限,请省去一些麻烦。

编辑:您也可以通过使用此REGEXP_SUBSTR进行比较来收紧它。regex使其匹配整个行,特别是将捕获的月/日组与所需的组匹配。如果没有找到该模式,则返回NULL,因此通过将其包围在NVL中,该NVL返回“未找到的值”或任何适当的内容,例如:

代码语言:javascript
复制
where regexp_substr(col3, '^\d{4}-(\d{2}-\d{2})\/\d{2}:\d{2}:\d{2}$', 1,1,null,1) = '04-25';
票数 1
EN

Stack Overflow用户

发布于 2016-04-26 13:59:05

如果要与日期(一个真正以日期时间格式表示的值)进行比较,无论它是来自数据库中的表的值,还是在运行时传入的绑定变量,还是任何其他类型的真正的“日期时间”tipe,您都可以这样进行比较:

代码语言:javascript
复制
... where to_date(substr(your_col, 1, instr(your_col, '/')-1), 'yyyy-mm-dd') = date_param

在这里,your_col是您在问题中说明的列的名称(包含“看起来像”日期/时间的字符串),而date_param是您想要比较的日期。

Note -如果date_param可能有一个时间组件(除了00:00:00),您将需要在右边有trunc(date_param)。在左侧,您不需要trunc(),因为to_date使用我已经显示的方式给出了一个“截断”数据(默认情况下时间设置为00:00:00 )。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36861436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档