在Like%中需要帮助

时间:2019-02-15 11:31:36

标签: sas

我有类似条件的小查询:

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列中的数据进行过滤(过滤?)。

3 个答案:

答案 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 Con​​tactName 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;