我有类似条件的小查询:
proc sql;
create table test as
select *
from Outlier_32
where
DX1 like between 'B0%' and 'C10' or
DX2 like between 'B0%' and 'C10' or
DX3 like between 'B0%' and 'C10' or
DX4 like between 'B0%' and 'C10'
;
quit;
基本上我有一个诊断范围,想对所有4个dx列中的数据进行过滤(过滤?)。
答案 0 :(得分:1)
替代选择条件可以对诊断代码变量的串联使用Perl正则表达式模式匹配。串联角色与or
测试单个变量的作用相同。
where prxmatch ('/(B|C)0/', cats(dx1,dx2,dx3,dx4))
从更广泛和更广泛的流行病学研究意义上讲,您可以考虑使用一个本体表,将诊断代码映射到疾病群或研究类别。
dx category
--- --------
B00 Foo
…
B99 Foo
C00 Foo
…
C09 Foo
dx
将被外键到所有诊断代码的主列表中。
然后,SQL查询选择标准将涉及相关子查询匹配项的存在。
where
exists (select * from ontology where category = 'Foo' and dx1 = dx) or
exists (select * from ontology where category = 'Foo' and dx2 = dx) or
exists (select * from ontology where category = 'Foo' and dx3 = dx) or
exists (select * from ontology where category = 'Foo' and dx4 = dx)
答案 1 :(得分:0)
您不能在一个条件语句like & beteewn
中使用多个sql条件运算符DX1 like between 'B0%' and 'C10'
。
手段=,<>,like,between
是sql条件运算符,您必须一次使用一个'Example: WHERE(DX1 LIKE 'B0%' OR DX1 BETWEEN 'B0' AND 'C10')
。
Like是通配符运算符,用于按模式过滤列数据。
WHERE CustomerName LIKE'a%'查找以“ a”开头的任何值
WHERE CustomerName LIKE'%a'查找以“ a”结尾的任何值
WHERE CustomerName LIKE'%or%'查找具有“或”的任何值 在任何位置
WHERE CustomerName LIKE' r%'查找任何值 在第二个位置带有“ r”的客户
WHERE CustomerName LIKE 'a %_%'查找以“ a”开头且至少为3的任何值 长度字符
WHERE ContactName LIKE'a%o'查找任何 以“ a”开头并以“ o”结尾的值
我不确定您的DX1,DX2列中的数据类型和值;但是根据对filter data by range
的疑问,您可以使用between
运算符。
WHERE DX1 BETWEEN 'B00' AND 'C10'
AND DX2 BETWEEN 'B00' AND 'C10'
AND DX3 BETWEEN 'B00' AND 'C10'
AND DX4 BETWEEN 'B00' AND 'C10';
答案 2 :(得分:0)
没有任何操作like between
。您可以使用截断的比较。运算符后的冒号修饰符告诉SAS仅比较最短参数的长度。请注意,无需使用SQL即可完成简单的数据步骤即可完成的工作。
data test ;
set Outlier_32 ;
where (DX1 >=: 'B0' and DX1 <= 'C10')
or (DX2 >=: 'B0' and DX2 <= 'C10')
or (DX3 >=: 'B0' and DX3 <= 'C10')
or (DX4 >=: 'B0' and DX3 <= 'C10')
;
quit;