首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套Case语句类型错误(postgres)

嵌套Case语句类型错误(postgres)
EN

Stack Overflow用户
提问于 2015-12-03 22:56:46
回答 2查看 1.5K关注 0票数 1

我已经创建了一些postgres代码,这给了我一个错误:

代码语言:javascript
运行
复制
ERROR:  CASE types character varying and numeric cannot be matched

代码:

代码语言:javascript
运行
复制
CREATE TABLE current_condition_joined AS SELECT
a.id, a.geom, a.condition_join_1, a.condition_join_2, a.condition_join_3,
(CASE WHEN b.condition = 'ERROR' THEN (CASE WHEN c.condition2 = 'ERROR' THEN d.condition3
                                       ELSE c.condition2
                                       END)
 ELSE b.condition
 END) current_condition,
(CASE WHEN b.condition= 'ERROR' THEN (CASE WHEN c.condition2 = 'ERROR' THEN d.ecosite3
                                      ELSE c.ecosite2
                                      END)
 ELSE b.ecosite
 END) current_ecosite,
(CASE WHEN b.condition = 'ERROR' THEN (CASE WHEN c.condition2 = 'ERROR' THEN d.ecophase3
                                       ELSE c.ecophase2
                                       END)
 ELSE b.ecophase
 END) current_ecophase,
(CASE WHEN b.condition = 'ERROR' THEN (CASE WHEN c.condition2 = 'ERROR' THEN d.consite3
                                       ELSE c.consite2
                                       END)
 ELSE b.consite
 END) current_consite,
(CASE WHEN b.condition = 'ERROR' THEN (CASE WHEN c.condition2 = 'ERROR' THEN d.conphase3
                                       ELSE c.conphase2
                                       END)
 ELSE b.conphase
 END) current_conphase
 FROM current_condition a, boreal_mixedwood_labeled b, boreal_mixedwood_labeled c, boreal_mixedwood_labeled d
 WHERE a.label = b.label_join_1
   and a.label2 = c.label_join_2
   and a.label3 = d.label_join_3;

b、c、d生态系统和阶段均为数值型。唯一的条件是varchar。

在第二和第三列中,创作是问题发生的地方。我假设我得到的是错误,因为在第一部分中,它引用的是varchar,但是第二种情况的结果是数字的。我想使用条件“错误”来选择要使用的数字值。

我刚接触postgres (9.4.5),但相当精通sql。我在pgAdmin (1.18.1节)的windows机器上工作。

我已经查看了问题的其他实例,但它们不考虑嵌套语句。我的案子怎么了?

从PGAdmin中的SQL窗格创建表PGAdmin的代码:

代码语言:javascript
运行
复制
CREATE TABLE current_condition (
  geom geometry,
  condition_join_1 text,
  condition_join_2 text,
  condition_join_3 text,
  id serial NOT NULL,
  CONSTRAINT current_condition_pkey PRIMARY KEY (id)
);

CREATE INDEX idx_current_condition_geom
  ON current_condition USING gist (geom);

boreal_mixedwood_labeled表的代码:

代码语言:javascript
运行
复制
CREATE TABLE boreal_mixedwood_labeled
(
  objectid serial NOT NULL,
  label character varying(255),
  label2 character varying(255),
  label3 character varying(255),
  condition character varying(255),
  ecophase numeric(15,6),
  ecosite numeric(15,6),
  conphase character varying(255),
  consite character varying(255),
  condition2 character varying(255),
  ecophase2 numeric(15,6),
  ecosite2 numeric(15,6),
  conphase2 character varying(255),
  consite2 character varying(255),
  condition3 character varying(255),
  ecophase3 numeric(15,6),
  ecosite3 numeric(15,6),
  conphase3 character varying(255),
  consite3 character varying(255),
  CONSTRAINT boreal_mixedwood_labeled_pkey PRIMARY KEY (objectid)

欧文的回答是正确的。虽然列中的值是数字的,但由于某种原因,表将它们作为字符。一定是从我的进口自动发生的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-03 23:15:56

错误的直接原因是数据类型不匹配,正如错误消息告诉您的那样。

在第二和第三列中,创作是问题发生的地方。

CASE表达式的所有可能结果都需要共享兼容的数据类型,因此这些数据类型必须匹配,但显然不是. 该手册规定:

所有结果表达式的数据类型必须转换为单个输出类型。有关更多详细信息,请参阅第10.5节

假设您引用了current_conditioncurrent_ecosite --它们实际上是第6和第7列,它们需要有匹配的数据类型:

代码语言:javascript
运行
复制
d.ecosite3
c.ecosite2
b.ecosite

以及:

代码语言:javascript
运行
复制
d.ecophase3
c.ecophase2
b.ecophase

更好的查询

boreal_mixedwood_labeled缺少表定义之前,我的猜测是您可以从根本上简化到这个查询:

代码语言:javascript
运行
复制
SELECT a.id, a.geom, a.condition_join_1, a.condition_join_2, a.condition_join_3
     , COALESCE(d.condition3, c.condition2, b.condition) AS current_condition
     , COALESCE(d.ecosite3,   c.ecosite2,   b.ecosite)   AS current_ecosite
     , COALESCE(d.ecophase3,  c.ecophase2,  b.ecophase)  AS current_ecophase
     , COALESCE(d.consite3,   c.consite2,   b.consite)   AS current_consite
     , COALESCE(d.conphase3,  c.conphase2,  b.conphase)  AS current_conphase
FROM   current_condition a
LEFT   JOIN boreal_mixedwood_labeled b ON a.label  = b.label_join_1
LEFT   JOIN boreal_mixedwood_labeled c ON a.label2 = c.label_join_2
                                      AND b.condition = 'ERROR'
LEFT   JOIN boreal_mixedwood_labeled d ON a.label3 = d.label_join_3
                                      AND c.condition2 = 'ERROR';

数据类型必须仍然匹配。

多么?

这不仅更短,而且可能也更快。

只有第二次加入boreal_mixedwood_labeled,如果b.condition = 'ERROR'开始,等等。

然后您可以使用一个更简单的COALESCE表达式:d.*是空的,除非我们需要它,c.*也是如此。返回第一个非空值。

如果boreal_mixedwood_labeled中的某些列为NULL,则逻辑可能中断。一切都取决于..。塔达!您的实际表定义。(我说得够多了吗?)别忘了把它和你的下一个问题.

票数 0
EN

Stack Overflow用户

发布于 2015-12-03 23:52:04

尝试消除嵌套的case。也许因为某种原因,它对编译器产生了影响:

代码语言:javascript
运行
复制
CASE
    WHEN b.condition = 'ERROR' AND c.condition2 = 'ERROR' THEN d.condition3
    WHEN b.condition = 'ERROR' THEN c.condition2
    ELSE c.condition
END as current_condition,
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34077833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档