如@Joe所解释的那样,SAS中只有两种数据类型:数字和字符。
每当遇到逻辑表达式时,SAS将产生True的值1和False的值0。
每当使用数值作为条件时,只有0和.被解释为False;其他所有数值等同于True。
逻辑表达式的示例:
* Parentheses are optional but make things clearer;
data logicalTest;
a = (1 < 2); * results in a = 1;
b = (1 > 2); * results in b = 0;
c = (-10e20 > .); * results in c = 1;
d = (. = .); * results in d = 1;
run;
如您所见,缺失值被视为数字,并且始终比任何数字都小。因此,在涉及缺失数据时,比较值时需要谨慎。
使用约束
如果这是您的需求,您可以始终向表添加约束,以便一个或多个列只能接受值0或1。例如:
PROC SQL;
create table logical
(id char (12) format=$12.,
bool num format=1.);
alter table logical
add constraint boolean check(bool in (.,0,1))
message = "Variable bool can only take values 0, 1, or null.";
QUIT;
现在,如果我们尝试插入不兼容的数据(如下面示例中的最后一行),将会收到错误消息。
PROC SQL;
insert into logical values ("ABC", 1);
insert into logical values ("DEF", 0);
insert into logical values ("GHI", .);
insert into logical values ("JKL", null);
insert into logical values ("JKL", 2);
QUIT;
日志显示:
27 PROC SQL;
28 insert into logical values ("ABC", 1);
NOTE: 1 row was inserted into WORK.LOGICAL.
(...)
32 insert into logical values ("JKL", 2);
ERROR: Variable bool can only take values 0, 1, or null. Add/Update failed for data set WORK.LOGICAL because data value(s) do not
comply with integrity constraint boolean.
NOTE: This insert failed while attempting to add data from VALUES clause 1 to the data set.
NOTE: Deleting the successful inserts before error noted above to restore table to a consistent state.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
使用格式
您还可以进一步为布尔变量添加格式:
PROC FORMAT;
VALUE boolean 0 = "False"
1 = "True"
. = "Unknown";
QUIT;
PROC SQL;
create table logical
(id char (12) format=$12.,
bool num format=boolean.);
alter table logical
add constraint boolean check(bool in (.,0,1))
message = "Variable bool can only take values 0, 1, or null.";
QUIT;
PROC SQL;
insert into logical values ("ABC", 1);
insert into logical values ("DEF", 0);
insert into logical values ("GHI", .);
insert into logical values ("JKL", null);
QUIT;
PROC DATASETS
命令添加扩展属性。 - Tom