Postgres:错误[42601]错误:语法错误在“$ 2”或附近。执行查询时出错

时间:2016-11-16 01:11:34

标签: postgresql

SELECT     
    to_char(messages. TIME, 'YYYY/MM/DD') AS FullDate, 
    to_char(messages. TIME, 'MM/DD') AS PartialDate, 
             COUNT(CASE WHEN message_definitions.error_category = ? THEN 1 END) AS Errors, 
    error_categories.threshold, 
    COUNT(CASE WHEN messages.message_id = 14 THEN 1 END) AS Picks
FROM    
    messages LEFT JOIN
    message_definitions USING (message_id) LEFT JOIN
    error_categories USING (error_category)
WHERE   
    (messages. TIME > TIMESTAMP ? - '30 day'::INTERVAL) AND 
    (messages. TIME < TIMESTAMP '2016-08-03' + '1 day'::INTERVAL) AND 
    (messages.system_id = ?) AND 
    (messages.message_id = 14 OR
     message_definitions.error_category = ?)
GROUP BY 
    FullDate, PartialDate, error_categories.threshold
ORDER BY
    FullDate DESC LIMIT 40

在上面的查询中,在where子句中,(第一行:(messages.TIME&gt; TIMESTAMP? - '30 day':: INTERVAL)AND )当参数是typecasted时(即我之前把TIMESTAMP放在?)我得到以下错误

enter image description here

对于第二行中的文本数据,情况并非如此(消息.TIME&lt; TIMESTAMP '2016-08-03'+'1天':: INTERVAL)和

当我将条款更改为(messages.TIME&gt; ?:: TIMESTAMP - '30天':: INTERVAL)时 ) (即我把TIMESTAMP放在后面?) 任何人都可以对正在发生的事情有所了解吗?谢谢!

注意: PostGresVersion - 9.6 OdBC驱动程序 - 32位驱动程序(位于C:\ Program Files(x86)\ psqlODBC \ 0905 \ bin \ psqlodbc30a.dll。) Postgres 8.4也是如此。

2 个答案:

答案 0 :(得分:0)

The documentation说:

  

可以使用以下任何一种符号输入任意类型的常量:

     

type 'string'
  'string'::type
  CAST ( 'string' AS type )

     

将字符串常量的文本传递给名为type的类型的输入转换例程。结果是指示类型的常量。

     

[...]

     

::CAST()和函数调用语法也可用于指定任意表达式的运行时类型转换,如第4.2.9节中所述。为避免语法歧义,type 'string'语法只能用于指定简单文字常量的类型。

因此,您只能将此语法与字符串文字一起使用,而不是像您尝试的那样使用参数。

答案 1 :(得分:0)

您试图添加的术语(例如字符串)可能应该包装在“”中。它对我有用,尽管我无法解释如何或为什么。