ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

SQL:CASE types text and date cannot be matchedの原因と対策

手持ちのデータを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

のように全て文字列型にするなど、型を合わせてしまいます。

SQL作成中
Photo by Christin Hume on Unsplash

SQLを少しずつ書いている途中に、動作が正しいか試してこのエラーが発生しました。
型が一致しないのでエラーになるのは、解決すれば納得です。
試している途中でのエラーなので、なにが悪いんだろうと悩みそうになりました。