【急】求sql实现条件查询

齊麟 2010-09-25 04:17:56
表RECORD_TABLE有两个字段:
RECORD_ID RECORD_CONTENT
------------- --------------------------------------------
7AGH3E48 2月份购买了一台电视机
46NS7CK6 三季度盖了一座新房子
167JKF06 2008年8月生了个胖宝宝
XJF83BG5 2009年12月又娶了个老婆
8DHN36SK 2010年一季度在家待岗
27FM389D 1995年5月
N8F86DN3 2012年会发生什么事情

要实现的功能是:
针对RECORD_CONTENT字段中以完整的日期格式开头的记录(注:所谓完整,指的是xxxx年x月、xxxx年xx月以及xxxx年x季度等格式的,)
实现时间查询。

sql的参数是201001或者201012这种格式,参数的数量为2,分别为查询条件的起始和截止时间。

例如:当查询条件为:200810,201009时,将会有:
XJF83BG5 2009年12月又娶了个老婆
8DHN36SK 2010年一季度在家待岗
这两条记录展示出来。
...全文
162 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
齊麟 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 minitoy 的回复:]
可能不完全合乎你的逻辑,你再改进改进吧.跟上面一样的,加了注释.
[/Quote]
符不符合我的逻辑,我暂时也不知道,如此强悍的代码,说实话没看太懂,至于改进更谈不上了,我先试试了。再次对您表示感谢!谢谢!!这次真的长见识了,呵呵
minitoy 2010-09-25
  • 打赏
  • 举报
回复
可能不完全合乎你的逻辑,你再改进改进吧.跟上面一样的,加了注释.
select t.*
from RECORD_TABLE t where translate(substr(t.record_content,1,4),'#1234567890','#') is null--前四位是数字
and ((translate (substr(t.record_content,6,instr(t.record_content,'月')-6),'#1234567890','#')is null and length(substr(t.record_content,6,instr(t.record_content,'月')-6))>0--判断月份格式的合法性) or
substr(t.record_content,6,instr(t.record_content,'季度')-6) in ('一','二','三','四')--判断季度格式的合法性)
and substr(t.record_content,1,4)||lpad(decode(substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6),'一','01','二','04','三','07','四','10',substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6)),2,'0')>'200810'--取区间起始值
and substr(t.record_content,1,4)||lpad(decode(substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6),'一','03','二','06','三','09','四','12',substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6)),2,'0')<'201009'--取区间结束值
齊麟 2010-09-25
  • 打赏
  • 举报
回复
谢谢九楼的大虾,对于您的代码 我再瞅瞅先,学习一下。
minitoy 2010-09-25
  • 打赏
  • 举报
回复
写个很笨的sql
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
Connected as tds

SQL> select * from record_table;

RECORD_ID RECORD_CONTENT
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
7AGH3E48 2月份购买了一台电视机
46NS7CK6 三季度盖了一座新房子
167JKF06 2008年8月生了个胖宝宝
XJF83BG5 2009年12月又娶了个老婆
8DHN36SK 2010年一季度在家待岗
27FM389D 1995年5月
N8F86DN3 2012年会发生什么事情

7 rows selected

SQL> select t.*
2 from RECORD_TABLE t
3 where translate(substr(t.record_content, 1, 4), '#1234567890', '#') is null
4 and ((translate(substr(t.record_content,
5 6,
6 instr(t.record_content, '月') - 6),
7 '#1234567890',
8 '#') is null and
9 length(substr(t.record_content,
10 6,
11 instr(t.record_content, '月') - 6)) > 0) or
12 substr(t.record_content, 6, instr(t.record_content, '季度') - 6) in
13 ('一', '二', '三', '四'))
14 and substr(t.record_content, 1, 4) ||
15 lpad(decode(substr(t.record_content,
16 6,
17 instr(t.record_content, '月') - 6) ||
18 substr(t.record_content,
19 6,
20 instr(t.record_content, '季度') - 6),
21 '一',
22 '01',
23 '二',
24 '04',
25 '三',
26 '07',
27 '四',
28 '10',
29 substr(t.record_content,
30 6,
31 instr(t.record_content, '月') - 6) ||
32 substr(t.record_content,
33 6,
34 instr(t.record_content, '季度') - 6)),
35 2,
36 '0') > '200810'
37 and substr(t.record_content, 1, 4) ||
38 lpad(decode(substr(t.record_content,
39 6,
40 instr(t.record_content, '月') - 6) ||
41 substr(t.record_content,
42 6,
43 instr(t.record_content, '季度') - 6),
44 '一',
45 '03',
46 '二',
47 '06',
48 '三',
49 '09',
50 '四',
51 '12',
52 substr(t.record_content,
53 6,
54 instr(t.record_content, '月') - 6) ||
55 substr(t.record_content,
56 6,
57 instr(t.record_content, '季度') - 6)),
58 2,
59 '0') < '201009';

RECORD_ID RECORD_CONTENT
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
XJF83BG5 2009年12月又娶了个老婆
8DHN36SK 2010年一季度在家待岗

SQL>
齊麟 2010-09-25
  • 打赏
  • 举报
回复
大慈大悲观世音菩萨,保佑我这个帖子中的问题能够顺利得到解决。
齊麟 2010-09-25
  • 打赏
  • 举报
回复
南无阿弥佗佛,来个高手给俺瞅瞅呗。。。
期待中~~~
齊麟 2010-09-25
  • 打赏
  • 举报
回复
xxxx年一季度、xxxx年二季度、xxxx年三季度、xxxx年四季度要分别转换成为:
xxxx03、xxxx06、xxxx09、xxxx12这种格式。
minitoy 2010-09-25
  • 打赏
  • 举报
回复
难.你要确认你要比较的日期格式有哪些.
然后根据格式产生两个伪字段,starttime和endtime,比如2010年一季度转换成
starttime=201001 endtime=201003,那么只要判断开始时间小于starttime,结束时间大于endtime,就可以把记录取出来.
齊麟 2010-09-25
  • 打赏
  • 举报
回复
普通的sql查询,复杂的是判断并提取 RECORD_CONTENT字段中的值并转换成时间格式,和查询条件进行比较,返回结果。。。
只是小弟才疏学浅,只有一个不成熟的思路,而没有jurisdiction的解决方案。。。
静候高人前来指点一二!!!
gelyon 2010-09-25
  • 打赏
  • 举报
回复
正则表达式可以实现!
dawugui 2010-09-25
  • 打赏
  • 举报
回复
这个?估计就是把各种条件写在后面即可。例如:

select * from tb where
(to_number(substr(RECORD_CONTENT,1,4)) between 1900 and 2100 and substr(RECORD_CONTENT,5,1) = '年' ....) or
(又一个条件) or
(又一个条件) ...
  • 打赏
  • 举报
回复
这个是全文索引吗?
没弄过,等楼下

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧