oracle sql !!急急急急

wangfengpp2004 2008-11-03 08:24:46
假设有这样一个表
tablename
列定义如下:(其实不止这些列)
a varchar(),b varchar(),c date

select t.* from tablename

假设result 为

a , ddGT ,2008-10-01
b , dd ,2008-10-01
c , ccGT ,2008-10-01
c , cc ,2008-10-01
c , eeGT ,2008-10-01

.......
%%GT和%% 如过同时出现只取%%
但是如果只有%%GT 则才显示%%GT的记录
比如:
当有b字段有ddGT,dd的记录时候只显示b字段中为dd的记录即可
但是如果b字段只有ddGT则才显示ddGT,即没有dd是才选择喊有ddGT的字段

比如上面的结果集应该为

b , dd ,2008-10-01
c , cc ,2008-10-01
c , eeGT ,2008-10-01
........
...全文
123 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
taxmma 2008-11-03
  • 打赏
  • 举报
回复
试试这个
select * from test where b not like '%GT'
union
select * from test where b like '%GT' and b not in
( select b||'GT' from test where b not like '%GT')
wangfengpp2004 2008-11-03
  • 打赏
  • 举报
回复
看的明白了 但是执行起来会很慢啊
wangfengpp2004 2008-11-03
  • 打赏
  • 举报
回复
为什么加上这句and nvl(substr(b,1,instr(b,'GT')-1),'X') not in(select b from test);
这个GT前面的dd,cc不是固定只有这两个值
数据很多 用in的 话回不会 很慢呢 数据上10w
vc555 2008-11-03
  • 打赏
  • 举报
回复
这个GT前面的dd,cc是固定就这两个值吗?如果固定就很容易。否则可用下面这个通用方法:
OPER@TL>select * from test;

A B
---------- ----------
a ddGT
b dd
c ccGT
c cc
c eeGT

OPER@TL>select * from test
2 where b in(select substr(b,1,instr(b,'GT')-1) from test)
3 union all
4 select * from test
5 where b not in(select nvl(substr(b,1,instr(b,'GT')-1),'X') from test)
6 and nvl(substr(b,1,instr(b,'GT')-1),'X') not in(select b from test);

A B
---------- ----------
b dd
c cc
c eeGT

OPER@TL>

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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