我已经创建了一些postgres代码,这给了我一个错误:
ERROR: CASE types character varying and numeric cannot be matched
代码:
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的代码:
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表的代码:
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)
欧文的回答是正确的。虽然列中的值是数字的,但由于某种原因,表将它们作为字符。一定是从我的进口自动发生的。
发布于 2015-12-03 23:15:56
错误的直接原因是数据类型不匹配,正如错误消息告诉您的那样。
在第二和第三列中,创作是问题发生的地方。
CASE
表达式的所有可能结果都需要共享兼容的数据类型,因此这些数据类型必须匹配,但显然不是. 该手册规定:。
所有结果表达式的数据类型必须转换为单个输出类型。有关更多详细信息,请参阅第10.5节。
假设您引用了current_condition
和current_ecosite
--它们实际上是第6和第7列,它们需要有匹配的数据类型:
d.ecosite3
c.ecosite2
b.ecosite
以及:
d.ecophase3
c.ecophase2
b.ecophase
更好的查询
在boreal_mixedwood_labeled
缺少表定义之前,我的猜测是您可以从根本上简化到这个查询:
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,则逻辑可能中断。一切都取决于..。塔达!您的实际表定义。(我说得够多了吗?)别忘了把它和你的下一个问题.
发布于 2015-12-03 23:52:04
尝试消除嵌套的case
。也许因为某种原因,它对编译器产生了影响:
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,
...
https://stackoverflow.com/questions/34077833
复制相似问题