2016-11-07 64 views
2

我试图使用Proc SQL和一个case-statement来测试一个条件并添加一个索引。但是,即使语法看起来与我见过的示例相匹配,我也无法使case - where语句正常工作。使用下面的代码,我得到以下错误:使用Proc SQL和Case-statement时出错

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, (, +, -, BTRIM, CALCULATED, CASE, EXISTS, INPUT, NOT, PUT, SELECT, SUBSTRING, TRANSLATE, USER, WHEN, ^, ~.

Proc SQL; 
    Create table table_ix AS 
    Select t1.*, 
      Case 
       Where UPCASE(t2.test) Contains UPCASE(TRIM(t2.key)) Then 1 
       Else 0 
      end as index 
    From Table1 AS t1, Table2 AS t2; 

QUIT; 

从什么可以在帮助看,我的发言的例子相匹配。这可能很容易解决,但我不能让它工作(例如,我试过匹配单个字符串以查看对单独表格的引用是否是问题,例如... Contains UPCASE("Teststring") ....
任何建议

回答

3

ANSI标准语法的CASE表达,这PROC-SQL如下据我所知,是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; 

注:我用FIND函数将您的呼叫替换为CONTAINS,因为this SAS reference提到CONTAINS仅在WHERE条款中可用。

顺便说一下,您可能打算在表1和表2中添加连接条件。目前,你正在做一个开放式的交叉连接。但希望我的查询将解决您的CASE表达式中的错误。

+0

嘎!我怎么能这样盲目,没有看到这些例子使用'when'(如你所说)而不是'where'。在连接表时,我在代码的早期使用'where'进行类似的匹配,这就是为什么我在复制代码后被'where'卡住的原因。谢谢! – fileunderwater

+0

我使用'Contains'的原因是传递一系列字符串(在t2中找到)在(t1.test)中搜索,选择或索引记录(这也是我没有加入的原因)。 'Find'可以工作,但是在t2中对每个匹配单独搜索到结果表将变为length(t1)* length(t2),并且需要一些后处理来删除重复项。尽管感谢解决方案。 – fileunderwater

+1

我在发布答案后立即投了票,现在已经接受了 – fileunderwater