手持ちのデータをSQLで加工していて、「CASE types text and date cannot be matched」というエラーが発生しました。
CASE types text and date cannot be matchedの原因
PostgreSQLに保存されているデータを取得するために、
SELECT name , url , CASE WHEN start_date = end_date THEN start_date ELSE to_char(start_date, 'YYYY/MM/DD') || '~' || to_char(end_date, 'YYYY/MM/DD') END FROM table1
というSQLを実行したら発生しました。
原因は、CASE types text and date cannot be matchedの通り、
, CASE WHEN start_date = end_date THEN start_date ELSE to_char(start_date, 'YYYY/MM/DD') || '~' || to_char(end_date, 'YYYY/MM/DD')
この部分の1行目の条件が成立すると、date型を返しますが、2行目になると、文字列型を返して、型が一致しないからです。
対策
型を合わせれば対策となるので、
SELECT name , url , CASE WHEN start_date = end_date THEN to_char(start_date, 'YYYY/MM/DD') ELSE to_char(start_date, 'YYYY/MM/DD') || '~' || to_char(end_date, 'YYYY/MM/DD') END FROM table1
のように全て文字列型にするなど、型を合わせてしまいます。
Photo by Christin Hume on Unsplash
SQLを少しずつ書いている途中に、動作が正しいか試してこのエラーが発生しました。
型が一致しないのでエラーになるのは、解決すれば納得です。
試している途中でのエラーなので、なにが悪いんだろうと悩みそうになりました。