楼主: 眼睛花
6059 6

[原创博文] 【求助】关于已定义宏变量转换字符类型 [推广有奖]

  • 6关注
  • 0粉丝

大专生

36%

还不是VIP/贵宾

-

威望
0
论坛币
1292 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
667 点
帖子
49
精华
0
在线时间
28 小时
注册时间
2010-12-20
最后登录
2016-5-3

楼主
眼睛花 发表于 2012-5-9 21:54:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问大神们;
    有没办法将已赋值的全局宏变量作类型转换。
    比如:
%let DD=05;
proc sql;
select * from x&DD.;
where y=&DD.;/*这里我想将&DD.的值转换为5*/
quit;
*因为y列是文本格式,并且我想保留全局变量不重新对&DD.赋值,请问有办法转换吗?
我想是的如果&DD.的值转换为数值型,DD结果为5,那么这个条件语句Where y='&DD.'就可以成立;即不影响全局变量,也可以使用。
或者有没其他的方法对宏定义的变量转换类型?
二维码

扫码加我 拉你入群

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

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

关键词:变量转换 proc sql Select Where Elect

沙发
chendonghui1987 发表于 2012-5-10 11:14:57
给你个例子.
data work.a;
        input name $ y;
        datalines;
a 1
b 2
c 3
d 4
e 5
;

%let DD=05;
proc sql;
        create table work.b as
                select * from work.a
                where y=input("&DD",8.);
quit;

藤椅
眼睛花 发表于 2012-5-11 19:33:00
chendonghui1987 发表于 2012-5-10 11:14
给你个例子.
data work.a;
        input name $ y;
Y列是文本格式,不是数值型,会报错.ERROR:用等于(=)的表达式具有不同数据类型的组件。

板凳
00810112 发表于 2012-5-11 21:22:56
把楼上的改一下,就可以了,用%eval
proc sql;
         create table work.b as
                select * from work.a
                 where y=%eval(&dd);
quit;

报纸
nernernini 发表于 2012-5-12 04:13:00
both methods work fine. thanks.

地板
眼睛花 发表于 2012-5-13 15:59:29
00810112 发表于 2012-5-11 21:22
把楼上的改一下,就可以了,用%eval
proc sql;
         create table work.b as
一样的问题,楼上的没将Y例定义文本格式;
我想了种方法的,利用%eval;
data work.a;
        input name $ y$;
        datalines;
a 1
b 2
c 3
d 4
e 5
;
Run;

%let DD=05;
%let i=%eval(&DD.*1);/*%eval是宏计算函数,通过运算转换定义的宏变量*/
proc sql;
         create table b_&DD. as
                select * from work.a
                 where y="&i.";/*要正确引用宏变量的值,这里必须用""而不是'',因为宏处理器只能在双引号中进行替代*/
quit;
我是通过这样的方法进行转换,麻烦就在要重新赋值宏变量;
査了不少书,发现宏很强大;不知道你们有没其他更简单的方法呢?

7
赵安豆 发表于 2024-6-24 12:05:18
在SAS中处理这种问题时,如果需要将宏变量值从字符型转换为数值型,并且希望保持原始宏变量不变的情况下,在SQL或数据步操作中进行即时转换是个好策略。对于你的需求,可以通过以下方式实现:

1. **使用SAS函数直接转换**:在WHERE子句中可以使用`INPUT()`函数将字符串转换成数字。但是因为你的列是文本类型,并需要匹配数值,我们可以反向思考:把&DD.的值当作数字使用,但在比较时转为字符。

2. **利用格式化**:如果y列的数据类型是字符型但按数值存储(例如通过`put()`或特定的INFORMAT),则可以直接使用&DD.而无需转换。但是考虑到你的情况,直接在WHERE子句中转换&DD.的值更合适。

具体实现方式如下:

```sas
%let DD=05;

proc sql;
select * from x&DD.
where put(y, 2.) = "&DD.";
quit;
```

这里的`put(y, 2.)`将y列数值转换为两个字符长度(包括小数点后的数字,此处无)的字符。因为&DD.在WHERE子句中直接作为文本使用,我们确保其格式和y列经过PUT函数处理后保持一致。

或者更简单地,在条件语句中直接转换宏变量值:

```sas
proc sql;
select * from x&DD.
where y = input("&DD.",2.);
quit;
```

但是这种方式在你的场景下不适用,因为y是字符型。然而,它展示了如何将宏中的字符数据立即转换为数值。

总结:通过使用`put()`或`input()`函数可以在保持全局宏变量不变的情况下进行类型转换操作,满足特定条件下的查询需求。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



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

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