2016-02-29 53 views
1

我是新人来的SQLPostgres,所以希望这不是很难找出你们所有人。在个案功能中使用职位功能 - PostgreSQL

我想一个CASE语句中使用定位功能,但我不断收到错误 "ERROR: Syntax error at or near ""Project"". LINE 2: CASE WHEN position('(' IN "Project") >0 THEN".

我以前用过这个位置的功能和它工作得很好,所以我很困惑什么问题在这里。我也尝试了表名,例如"xyztable.Project""Project" - 都没有引号。

下面是完整的语句:

SELECT "Project", 
CASE WHEN postion('(' IN "Project") >0 THEN 
    substring("Project",position('(' IN "Project")+1,position(')' IN "Project")-2) 
CASE WHEN postion('('IN "Project") IS NULL THEN 
    "Project" 
END 
FROM "2015Budget"; 

正如我还没有得到过去的这个声明的第二行,如果有人看到任何会阻止这一说法无法正常运行,请随时点出来。

新声明:

SELECT "Project", 
CASE 
    WHEN position('(' IN "Project") >0 THEN 
    substring("Project",position('(' IN "Project")+1,position(')' IN "Project")-2) 
    WHEN position('('IN "Project") IS NULL THEN 
    "Project" 
END 
FROM "2015Budget"; 

谢谢您的帮助!

回答

1

的错误是由于一个简单的错字 - postion,而不是position

你一般会得到这样的情况下(例如“功能postion(text,text)不存在”)一个更易于理解的错误消息。然而,使用特定于函数的关键字作为参数分隔符(按照SQL标准的规定),这使得解析器难以应付这种情况。

固定在此之后,你会碰到另一个错误。请注意,多支CASE表达式的一般形式是:

CASE 
    WHEN <condition1> THEN <value1> 
    WHEN <condition2> THEN <value2> 
    ... 
END 
+0

啊,我明白了。猜猜我到这个时候太晚了:)。 – christopheralan88

+0

我在原始问题中添加了新语句。但是,没有行被返回,我得到两列,Project和Case。相反,我想一个列中返回名为Project Number,表示返回的项目列一个子如果项目字段包含“(”,否则,我希望它只是返回的项目现场。你知道如何做到这一点? – christopheralan88

+1

这是返回第二列是因为你在查询的第一行列出了“Project”,你可以在'CASE'语句末尾加上'AS“项目号”'来命名另一列。零行,那是因为你的' “2015Budget”'表是空的。 –