免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4244 | 回复: 21
打印 上一主题 下一主题

SQL语句请教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-31 16:29 |只看该作者 |倒序浏览
各位高手:
    请教一个DB的问题,在INFORMIX数据库中,有一个商品表,我想通过SQL语句查询商品名称中最前面有两个字母‘DD’的商品如:(‘DD富绅衬衫’),语句应该怎样写,商品名称的字段名叫gname,表名叫goods,请教大家伙,先谢了。

论坛徽章:
0
2 [报告]
发表于 2003-07-31 16:34 |只看该作者

SQL语句请教!

oracle中这个语句是这样的
select * from goods where gname like 'DD%';

论坛徽章:
0
3 [报告]
发表于 2003-07-31 16:36 |只看该作者

SQL语句请教!

select gname from goods
     where gname like "DD%"
    对不对也不确定,我也是新手,大家探讨一下吧

论坛徽章:
0
4 [报告]
发表于 2003-07-31 16:37 |只看该作者

SQL语句请教!

select * from goods where gname='DD富绅衬衫'

论坛徽章:
0
5 [报告]
发表于 2003-07-31 16:40 |只看该作者

SQL语句请教!

substr


  1. select gname from good where substr(gname,0,2) = 'DD';

复制代码

论坛徽章:
0
6 [报告]
发表于 2003-07-31 16:45 |只看该作者

SQL语句请教!

SWWIN我佩服死你了,呵呵!

论坛徽章:
0
7 [报告]
发表于 2003-07-31 16:45 |只看该作者

SQL语句请教!

谢谢给位,还是好人多啊!!!!

论坛徽章:
0
8 [报告]
发表于 2003-07-31 17:40 |只看该作者

SQL语句请教!

select gname from good where substr(gname,0,2) = 'DD';
substr 有什么好处 如果在gname字段做了索引
做类式
select gname from good where substr(gname,0,2) = '%DD';
的查询,听说查询优化器是不引用索引的。
那么用substr来改造会引用索引吗?——假设gname字段的长度一定。
还有substr(gname,0,2)中 0,2的解读是不是gname字段的第0字符到第2字符。那岂不是三个字符了?还有,如果是中间字符--比如第二、三位是DD字符,怎么写substr呢?

:)弱弱。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
9 [报告]
发表于 2003-07-31 19:44 |只看该作者

SQL语句请教!

原帖由 "text2002" 发表:
select gname from good where substr(gname,0,2) = 'DD';
substr 有什么好处 如果在gname字段做了索引
做类式
select gname from good where substr(gname,0,2) = '%DD';
的查询,听说查询优化器是不引用索引的..........

那个...上面以DD开头的应该是用substr(gname,1,2)吧,如果DD是在2,3位的话,就是substr(gname,2,2)了....

不过还是不明白在这里用like 'DD%'    和substr(gname,1,2)有什么区别...

论坛徽章:
0
10 [报告]
发表于 2003-07-31 21:48 |只看该作者

SQL语句请教!

又什么区别,我做了一个试验:
如下:

  1. create table testsubstr(OID number not null PRIMARY KEY,
  2.                    ngame varchar2(20));
  3. create index ngameindex on testsubstr(ngame);
  4. declare
  5. i number;
  6. begin
  7. i:=0;
  8. while(i<200000) loop
  9. if((i mod 10) = 4)
  10. then
  11. insert into testsubstr(OID,ngame) values(i,'DDwee');
  12. else
  13. insert into testsubstr(OID,ngame) values(i,'weeDD');
  14. end if;
  15. i:=i+1;
  16. end loop;
  17. end;
复制代码


上面是建表,加索引,加数据

下面我用oci进行了测试,下面的又部分代码是用对oci进行亲度封装的类,不影响效率:


  1. int TimeStart, TimeEnd, TimeDelta;
  2.         TimeStart = timeGetTime();
  3.         string query;
  4.         query = "select OID from testsubstr where substr(ngame,0,2) = 'DD' ";
  5.         statement &st = *conn.prepare(query.data());
  6.         resultset &rs = *st.select ();
  7.         rs.release();
  8.         st.release();
  9.         TimeEnd = timeGetTime();
  10.         TimeDelta = TimeEnd - TimeStart;
  11.         printf("substr= %d\n", TimeDelta );

  12.         TimeStart = timeGetTime();
  13.         query = "select OID from testsubstr where ngame like 'DD%'";
  14.         statement &st2 = *conn.prepare(query.data());
  15.         resultset &rs2 = *st2.select ();
  16.         rs2.release();
  17.         st2.release();
  18.         TimeEnd = timeGetTime();
  19.         TimeDelta = TimeEnd - TimeStart;
  20.         printf("like= %d\n", TimeDelta );
复制代码


得到的结果是
substr = 1773
like = 47979

可能like的语句用到了索引,但是like操作太费时间,优化器也没有办法,可见还是substr好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP