楼主: bensuccess
5897 11

[原创博文] 请教下面的WHERE语句是否有更高效的表达方式 [推广有奖]

  • 0关注
  • 0粉丝

学前班

50%

还不是VIP/贵宾

-

威望
0
论坛币
4 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
32 点
帖子
5
精华
0
在线时间
0 小时
注册时间
2009-11-23
最后登录
2011-11-26

楼主
bensuccess 发表于 2009-11-23 03:59:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如题,语句如下。请教该如何修改来提高效率呢?虽然以下语句可以实现。谢谢!

DATA X;
SET Y;
WHERE ZName like 'AZATHIOP%' OR ZName like 'IMURA%' OR ZName like 'AZASAN%'
OR ZName like 'CYCLOSP%' OR ZName like 'GENGRAF%' OR ZName like 'NEORAL%'
OR ZName like 'SANGCYA%' OR ZName like 'SANDIMMU%' OR ZName like 'MYCOPHENOL'
OR ZName like 'ATGAM%' OR ZName like 'THYMOGLOBU' OR ZName like 'ANTI-THYMO';
RUN;

因为ZName很多,感觉上面的表达有点冗长,但自己又找不到其他更好的表达方式。期待大家不吝赐教。谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Where 表达方式 HERE whe name 表达方式 如何

回帖推荐

horace_chen 发表于2楼  查看完整内容

可以考虑用正则表达式。 data x; set y; rc=prxparse('/(\bAZATHIOP\w*\b)|(\bIMURAA\w*\b)|(\bZASAN\w*\b)|(\bCYCLOSP\w*\b)/'); if prxmatch(rc,ZName) then output; run; 没测试,仅供参考。

MyLoveSas 发表于9楼  查看完整内容

利用Hash Object的方法: /*生成键值表*/ DATA DSNKEY ; NPUT ZNAME $12. ; CARDS ; AZATHIOP_ IMURA_ AZASAN_ CYCLOSP_ GENGRAF_ NEORAL_ SANGCY_ SANDIMMU_ MYCOPHENOL_ ; RUN ; /*实例数据表*/ DATA Y ; INPUT ZNAME $12. ; CARDS ; AZATHIOP_ IMUA_ AZASAN_ CYCLOSP_ GENGRAF_ NEO_ SANGCY_ SANDIMMU_ BBBBBBBBBBB MYCOPHENOL_ AAAAAAA ; RUN ; DATA X ; DECLARE HASH HK() ; R ...

本帖被以下文库推荐

沙发
horace_chen 发表于 2009-11-23 10:31:24
可以考虑用正则表达式。
data x;
        set y;
        rc=prxparse('/(\bAZATHIOP\w*\b)|(\bIMURAA\w*\b)|(\bZASAN\w*\b)|(\bCYCLOSP\w*\b)/');
        if prxmatch(rc,ZName) then output;
        run;

没测试,仅供参考。
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

藤椅
bensuccess 发表于 2009-11-25 03:21:12
非常感谢!——虽然不懂。
千金散尽还复来!

板凳
dys2000 发表于 2009-11-25 09:27:08
SAS里还可以用与此正则表达式的?!寒!!!!

报纸
gooddrug 发表于 2009-11-25 12:07:24
sas中like语句通常用于寻找某个字符中包含某一个或几个字母,看你列出来的好象是一个字符串的全部字母,如果你知道这个字母串就没有必要再用like语句了。可以选择,
where name in ("AZATHIOP”  "IMURA" "AZASAN"……)
仅供参考!希望有用。

地板
MyLoveSas 发表于 2009-11-25 12:36:10
可以考虑用sas中的hash object。。。

7
bensuccess 发表于 2009-11-27 01:26:30
gooddrug 发表于 2009-11-25 12:07
sas中like语句通常用于寻找某个字符中包含某一个或几个字母,看你列出来的好象是一个字符串的全部字母,如果你知道这个字母串就没有必要再用like语句了。可以选择,
where name in ("AZATHIOP”  "IMURA" "AZASAN"……)
仅供参考!希望有用。
谢谢!看您的用户名是做药的吗?我是学药的。呵呵。
我使用的数据库对数据的维护不太好,导致同一药名有多种表达,初筛后发现如Azasan有AZASAN, AZASAN 100, AZASAN 75M, AZASAN-AZA表达,所以考虑用LIKE语句。
只是我感觉我写得稍繁琐(虽然一个原因是涉及药名多),故此请教是否有简洁表达方式。

多谢各位的帮助!
千金散尽还复来!

8
bobguy 发表于 2009-11-27 06:06:20
1# bensuccess

The simplest way in this case is use IN: operator. See example below.

Note IN: may not waork in other sas package.

data y;
length zname $20;
zname= 'AZATHI' ; output;
  zname= 'AZATHIOP' ; output;
  zname= 'AZATHIOPx' ; output;
  zname= 'IMURA' ; output;
  zname= 'IMURAy' ; output;
  zname= 'IM' ; output;


DATA X;
SET y;
WHERE ZName in: ( 'AZATHIOP', 'IMURA');
RUN;

proc print; run;

******************************
Obs    zname

  1     AZATHIOP
  2     AZATHIOPx
  3     IMURA
  4     IMURAy

9
MyLoveSas 发表于 2009-11-27 22:34:23
利用Hash Object的方法:

/*生成键值表*/
DATA DSNKEY ;
NPUT ZNAME $12. ;
CARDS ;
AZATHIOP_
IMURA_
AZASAN_
CYCLOSP_
GENGRAF_
NEORAL_
SANGCY_
SANDIMMU_
MYCOPHENOL_
;
RUN ;

/*实例数据表*/
DATA Y ;
INPUT ZNAME $12. ;
CARDS ;
AZATHIOP_
IMUA_
AZASAN_
CYCLOSP_
GENGRAF_
NEO_
SANGCY_
SANDIMMU_
BBBBBBBBBBB
MYCOPHENOL_
AAAAAAA
;
RUN ;

DATA X ;
  DECLARE HASH HK() ;
  RC = HK.DEFINEKEY( 'ZNAME' ) ;
  RC = HK.DEFINEDATA( 'ZNAME' ) ;
  RC = HK.DEFINEDONE() ;
  
  DO UNTIL( _EOF1 ) ;
    SET WORK.DSNKEY END = _EOF1 ;
    RC = HK.ADD() ;
  END ;
  DO UNTIL( _EOF2 ) ;
    SET Y END = _EOF2 ;
RC = HK.FIND() ;
IF RC = 0 THEN OUTPUT ;
  END ;
RUN ;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

10
bensuccess 发表于 2009-11-29 01:07:33
IN 应该是去找到完全相同的值,而相似的值无法找到。
多谢各位的热情帮助。
HASH还得学啊。
千金散尽还复来!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 12:48