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

用于字符串数据SQL验证的SAS等效程序,sql,string,validation,sas,enterprise-guide,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 案例 当类似于“[a-z][0-9][a-z][0-9][a-z][0-9]”时

我正在尝试验证一些长度为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
案例
当类似于“[a-z][0-9][a-z][0-9][a-z][0-9]”时
然后“有效”
否则“无效”
结束
我可以在SAS中使用哪些功能来实现这一点?我正在使用SAS EG作为我的工具


谢谢

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

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中做同样的事情,或者其他一些同样有效的事情。

你也可以考虑使用find(<强>字符串搜索< /强>,<强>字符串>查找< /强>)。

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


只要FIND()返回的数字大于0,就知道其中有匹配项。

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

在这种方法中,依次检查每个字符。substr(,&pos,1)隔离字符,如果字符类型不正确(由“x”是“a”还是“d”指定),则压缩(,'xk')删除该字符。如果字符类型正确,则应用lengthn()函数返回1,否则返回0。请注意,length()将不起作用,因为它将为空字符串返回1。然后,如果所有字符的类型都正确,则分配“Valid”

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';

你的术语在这里并不直截了当,我不认为。你是在EG中编写SAS代码,还是在使用EG点击工具(你说“作为我查询中的计算列”,它不会解析为SAS代码)。请注意,我的正则表达式中的
I
标志是不区分大小写的匹配(正如我记忆中最类似的语法一样)-如果您需要区分大小写,请将其删除。