在vertica中获取错误:对于' IN',varchar和int类型不一致DETAIL:列:未知和未知

时间:2017-03-07 06:53:00

标签: vertica

我正在尝试在vertica中执行以下查询:

select case 
when to_char(to_date('02-15-2017','mm-dd-yyyy'),'mm')in(1,2,3,4,5,6,7,8,9,10) then 
(select to_char(add_months(trunc(to_date('02-15-2017','mm-dd-yyyy'),'year'),-2),'mm-dd-yyyy') from dual);
else 
(select to_char(add_months(trunc(to_date('02-15-2017','mm-dd-yyyy'),'year'),10),'mm-dd-yyyy') from dual)
end ett from dual;

查询在oracle中获得预期结果,但在Vertica中获取错误

  

:对于' IN',varchar和int类型不一致DETAIL:列:   未知和未知。

预期结果是截至2016年11月1日的财政开始日期。

1 个答案:

答案 0 :(得分:1)

基本问题是您正在将字符串与IN()谓词中的数字进行比较。 (TO_CHAR()带有一个数字列表)。虽然Oracle(您使用的语法建议)经常隐式转换数据类型以进行比较,但Vertica与大多数其他更符合ANSI标准的数据库一样,要严格得多。

你可以用更简洁的方式写下你的陈述:

  • 您不需要Vertica中的FROM dual子句(即使它在内部隐式添加)
  • 您甚至不必将SELECTS嵌套在Oracle中;它足以选择整个CASE表达式。
  • 您可以使用ISO格式并在该字符串前面加上DATE关键字,从而更轻松地制定日期文字。

所以,一般来说,我会这样写:

SELECT
  CASE 
    WHEN MONTH(DATE '2017-02-15') <= 10
     THEN TO_CHAR(ADD_MONTHS(TRUNC(DATE '2017-02-05','YEAR'), -2),'mm-dd-yyyy')
    ELSE  TO_CHAR(ADD_MONTHS(TRUNC(DATE '2017-02-05','YEAR'), 10),'mm-dd-yyyy')
  END AS ett
;