SAS SQL-来自“的中间语句”;01“;至;08“;包括「;000“;

SAS SQL-来自“的中间语句”;01“;至;08“;包括「;000“;,sql,sas,where,Sql,Sas,Where,我运行的代码如下: proc sql; create table my_table as select * from other_table where myvar between "01" and "08"; quit; 然后我得到包含“000”的结果。如果我改写 proc sql; create table my_table as select * from other_table where myvar between "01" and "08" and not "000"; quit;

我运行的代码如下:

proc sql;
create table my_table as
select * from other_table
where myvar between "01" and "08";
quit;
然后我得到包含“000”的结果。如果我改写

proc sql;
create table my_table as
select * from other_table
where myvar between "01" and "08" and not "000";
quit;
我得到一个空数据集


我是个新手,但如果有任何帮助,我将不胜感激。

我无法重现这种行为:

data have;
  input myvar :$3.;
cards;
00
04
08
000
001
;
run;

proc sql;
select myvar from have 
where myvar between "01" and "08";
quit;
是否可能对变量应用了一种格式,使得范围
“01”-“08”
中的另一个值被伪装成
“000”
?您可以通过指定显示结果时使用的格式来排除这种情况:

proc sql;
select myvar format=$3. from have 
where myvar between "01" and "08";
quit;
当将where子句更改为包含
“00”
时,我确实在结果中得到了
“000”

这似乎是因为在比较不同长度的字符串时,默认的SAS排序规则序列中空格位于零之前

添加额外条件将导致返回零行:

proc sql;
select myvar from have 
where (myvar between "00" and "08") and not "000";
quit;
这是因为在SAS中,任何字符串的逻辑值都是
True
,然后对其求反。我添加了括号来澄清发生了什么。如果删除
not
,则会得到
between
表达式返回的所有行

如果要排除所有3位代码以及000,可以通过显式检查长度来实现:

proc sql;
select myvar from have 
where (myvar between "00" and "08") and length(myvar) = 2;
quit;

我无法重现这种行为:

data have;
  input myvar :$3.;
cards;
00
04
08
000
001
;
run;

proc sql;
select myvar from have 
where myvar between "01" and "08";
quit;
是否可能对变量应用了一种格式,使得范围
“01”-“08”
中的另一个值被伪装成
“000”
?您可以通过指定显示结果时使用的格式来排除这种情况:

proc sql;
select myvar format=$3. from have 
where myvar between "01" and "08";
quit;
当将where子句更改为包含
“00”
时,我确实在结果中得到了
“000”

这似乎是因为在比较不同长度的字符串时,默认的SAS排序规则序列中空格位于零之前

添加额外条件将导致返回零行:

proc sql;
select myvar from have 
where (myvar between "00" and "08") and not "000";
quit;
这是因为在SAS中,任何字符串的逻辑值都是
True
,然后对其求反。我添加了括号来澄清发生了什么。如果删除
not
,则会得到
between
表达式返回的所有行

如果要排除所有3位代码以及000,可以通过显式检查长度来实现:

proc sql;
select myvar from have 
where (myvar between "00" and "08") and length(myvar) = 2;
quit;

另一个想法是将文本转换为数字,然后在1和8之间使用

where input(char,8.) between 1 and 8;

另一个想法是将文本转换为数字,然后在1和8之间使用

where input(char,8.) between 1 and 8;

您的数据是什么样子的?“myvar”是一个字符串还是一个数字?您可能想要
而myvar不是“000”
或者类似的东西(可能
myvar不是“000”
?)-between语句类似于二进制运算符,因为它需要两个输入,由
分隔,但在这之后,您只需计算布尔语句
,其中不是“000”
,我相信这将计算为false。假设您删除了介于“01”和“08”之间的
myvar
——您的where子句是什么样子的?(提示:
从其他非“000”的表中选择*
-这有意义吗)小心使用分隔符。双引号用于名称。单引号用于字符串。如果您碰巧有一个名为“01”或“08”的列,那么您可以根据它们的值而不是字符串来检查myvar。那么,myvar是什么数据类型?为什么要将它与包含数字的字符串进行比较?如果myvar是数值型的,则使用介于0和8之间的
myvar
,如果还没有,则准备好获取myvar='02xyz',这可能是需要的,也可能是不需要的。@Thorstenketner某些语言可能对名称使用双引号,但在SAS中不使用。在SAS中,文字可以使用单引号或双引号。除非您将
dquote=ansi
选项添加到
proc sql
语句中。您的数据是什么样的?“myvar”是一个字符串还是一个数字?您可能想要
而myvar不是“000”
或者类似的东西(可能
myvar不是“000”
?)-between语句类似于二进制运算符,因为它需要两个输入,由
分隔,但在这之后,您只需计算布尔语句
,其中不是“000”
,我相信这将计算为false。假设您删除了介于“01”和“08”之间的
myvar
——您的where子句是什么样子的?(提示:
从其他非“000”的表中选择*
-这有意义吗)小心使用分隔符。双引号用于名称。单引号用于字符串。如果您碰巧有一个名为“01”或“08”的列,那么您可以根据它们的值而不是字符串来检查myvar。那么,myvar是什么数据类型?为什么要将它与包含数字的字符串进行比较?如果myvar是数值型的,则使用介于0和8之间的
myvar
,如果还没有,则准备好获取myvar='02xyz',这可能是需要的,也可能是不需要的。@Thorstenketner某些语言可能对名称使用双引号,但在SAS中不使用。在SAS中,文字可以使用单引号或双引号。除非您将
dquote=ansi
选项添加到
proc sql
语句中。我认为这是正确的答案。你所要求的字符比较可能与你期望的结果不符,因此最好使用数字比较。我同意!当使用为数字设计的函数时,将字符转换为数字更安全!我尝试过使用cast()或convert(),但我无法使其工作:/yeah cast将无法工作您在SAS中并且没有通过SQL server使用密码。正确的功能是真正的输入(char,8)。我认为这是正确的答案。你所要求的字符比较可能与你期望的结果不符,因此最好使用数字比较。我同意!当使用为数字设计的函数时,将字符转换为数字更安全!我尝试使用cast()或convert(),但无法使