SAS等效于字符串数据的SQL验证

时间:2018-01-29 19:03:26

标签: sql string validation sas enterprise-guide

我试图验证一些长度为6的字母数字数据,并且我在SQL中有一段代码可以执行此操作,但我在如何使用SAS作为计算列进行编码时遇到了困难。我的询问。

在SQL中,我的数据中的有效字符串符合以下条件:

CASE 
   WHEN <String> LIKE '[a-z][0-9][a-z][0-9][a-z][0-9]' 
      THEN 'Valid'
      ELSE 'Invalid' 
END

我可以在SAS中使用哪些功能来实现这一目标?我使用SAS EG作为我的工具。

谢谢!

3 个答案:

答案 0 :(得分:2)

假设您要求将其写为SAS代码,可以通过多种方式完成此操作。你可以做的最相似的是使用Perl正则表达式;我不认为SAS中的LIKE支持正则表达式语法(尽管[是一个特殊字符),或者至少documentation没有提到它,我无法让它工作。

data have;
length charvar $6;
  input charvar $;
  datalines;
a1b2c3
1A2B3C
AAAAAA
111111
C3B2A1
;;;;
run;

proc sql;
select charvar, 
CASE 
   WHEN prxmatch('/[a-z][0-9][a-z][0-9][a-z][0-9]/i',charvar)
      THEN 'Valid'
      ELSE 'Invalid' 
END
from have;
quit;

您可以在SAS datastep中执行相同的操作,或者其他一些可以正常工作的事情。

答案 1 :(得分:0)

您还可以考虑使用FIND(要搜索的字符串 您要查找的字符串 )。

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002267763.htm

  

FIND函数在字符串中搜索指定子字符串的第一个匹配项,并返回该子字符串的位置。如果在字符串中找不到子字符串,则FIND返回值0。

只要你的FIND()返回一个大于0的数字,你就会知道你在那里有一个匹配。

答案 2 :(得分:0)

我认为Joe使用Perx正则表达式和prxmatch()的答案是解决这个问题的最佳方法。但是,为了演示SAS宏和字符串函数,这里有一个替代方案。

在这种方法中,依次检查每个角色。 substr(,&amp; pos,1)隔离字符,如果字符的类型不正确,则压缩(,&#39; xk&#39;)删除字符(由&#39; x&#39;是&#39; a&#39;或者&#39;)。如果字符的类型正确,则应用lengthn()函数返回1,否则返回0。请注意,length()将不起作用,因为它将为空字符串返回1。然后,&#39;有效&#39;如果所有字符的类型都正确,则会被分配。

data have;
    length charvar $6;
    input charvar $;
    datalines;
a1b2c3
1A2B3C
AAAAAA
111111
C3B2A1
;
run;

* invar is the variable, pos is the position of the letter being checked, type is be d for digits or a for letters;
%macro check(invar, pos, type) ;
    (1 = lengthn(compress(substr(&invar, &pos, 1), , "&type.k")))
%mend  ;

data validation ;
    set have ;
    length validation $7 ;
    if %check(charvar, 1, a) & %check(charvar, 2, d) & %check(charvar, 3, a) & 
       %check(charvar, 4, d) & %check(charvar, 5, a) & %check(charvar, 6, d)
        then validation = 'Valid' ;         
        else validation = 'Invalid' ;       
run ;
dm 'vt validation';