簡體   English   中英

嵌套的Case語句類型錯誤(postgres)

[英]Nested Case statement type error (postgres)

我有一些我創建的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。 我正在Windows機器上的pgAdmin(v。1.18.1)中工作。

我看過我的問題的其他實例,但它們不考慮嵌套語句。 我的箱子有什么問題?

在PGAdmin的“ SQL”窗格中創建表current_condition的代碼:

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);

該boral_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)

ERWIN的答案是正確的。 雖然列中的值是數字,但出於某種原因,表中將它們作為字符。 一定是從我的導入中自動發生的。

嘗試消除嵌套的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,
...

錯誤的直接原因是錯誤消息告訴您數據類型不匹配。

在第二列和第三列中,就是問題所在。

CASE表達式的所有可能結果都需要共享兼容的數據類型,因此這些數據類型必須匹配,但顯然不匹配。 手冊說明:

所有結果表達式的數據類型必須可轉換為單個輸出類型。 有關更多詳細信息,請參見第10.5節

假設您引用current_conditioncurrent_ecosite實際上是第6列和第7列,則它們需要具有匹配的數據類型:

d.ecosite3
c.ecosite2
b.ecosite

和:

d.ecophase3
c.ecophase2
b.ecophase

更好的查詢

在為boreal_mixedwood_labeled缺少表定義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';

數據類型必須仍然匹配。

怎么樣?

這不僅更短,而且可能更快。

僅當b.condition = 'ERROR'開始時,才第二次加入boreal_mixedwood_labeled

然后,您可以使用一個更簡單的COALESCE表達式:除非我們需要d.*為NULL,否則c.* 返回第一個非空值。

如果boreal_mixedwood_labeled某些列可以為NULL,則邏輯可能會中斷。 這一切都取決於...多田! ...您的實際表定義 (我已經提到足夠了嗎?)。 不要忘記在下一個問題中包括它...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM