Sas 使用Proc SQL和Case语句时出错
我尝试使用procsql和case语句来测试条件并添加索引。但是,我无法使Sas 使用Proc SQL和Case语句时出错,sas,proc-sql,Sas,Proc Sql,我尝试使用procsql和case语句来测试条件并添加索引。但是,我无法使case-where语句起作用,即使语法似乎与我看到的示例相匹配。使用下面的代码,我得到以下错误: 错误22-322:语法错误,应为以下内容之一:名称、带引号的字符串、数字常量、日期时间常量, 缺少的值,(,+,-,BTRIM,computed,CASE,EXISTS,INPUT,NOT,PUT,SELECT,SUBSTRING,TRANSLATE,USER,WHEN, ^,~ 从“帮助”中可以看到,我的语句与示例相匹配。
case
-where
语句起作用,即使语法似乎与我看到的示例相匹配。使用下面的代码,我得到以下错误:
错误22-322:语法错误,应为以下内容之一:名称、带引号的字符串、数字常量、日期时间常量,
缺少的值,(,+,-,BTRIM,computed,CASE,EXISTS,INPUT,NOT,PUT,SELECT,SUBSTRING,TRANSLATE,USER,WHEN,
^,~
从“帮助”中可以看到,我的语句与示例相匹配。这可能很容易解决,我也有一点疏忽,但我无法让它正常工作(例如,我尝试匹配单个字符串,以查看对单独表的引用是否存在问题,例如……包含UPCASE(“Teststring”)
…有什么建议吗?Proc SQL遵循AFAIK的
CASE
表达式的ANSI标准语法是CASE WHEN
,而不是CASE WHERE
。请尝试以下查询:
CREATE TABLE table_id AS
SELECT t1.*,
CASE WHEN FIND(t2.test, TRIM(t2.key), 'i') GE 1 THEN 1 ELSE 0 END AS index
FROM Table1 AS t1, Table2 AS t2;
注意:我将对CONTAINS
的调用替换为FIND
函数,因为提到CONTAINS
仅在WHERE
子句中可用
顺便说一句,您可能打算向表1和表2添加连接条件。目前,您正在表1和表2之间进行开放式交叉连接。但希望我的查询能够解决您的
CASE
表达式中的错误。Gah!我怎么能如此盲目,看不到示例在时使用(如您所说)而不是where
。我之前在代码中使用了where
,用于连接表时的类似匹配,这就是为什么在复制代码后我一直使用where
。谢谢!我使用Contains
的原因是传递一系列字符串(在t2中找到)来搜索in(t1.test),选择或索引记录(这也是我不加入的原因)。Find
起作用,但在t2中单独搜索每个匹配项,结果表变为length(t1)*length(t2),并需要一些后期处理来删除重复项。不过感谢您的解决方案。我在您发布答案后直接投票,现在已接受
CREATE TABLE table_id AS
SELECT t1.*,
CASE WHEN FIND(t2.test, TRIM(t2.key), 'i') GE 1 THEN 1 ELSE 0 END AS index
FROM Table1 AS t1, Table2 AS t2;