从 C++ 代码通过 PQsendQuery 执行 sql 时 Postgres SQL 解析错误 - SQLState: 42601 消息:语法错误位于或附近“”

问题描述

我有 Postgres 9.5 数据库的下表:

\d t_rstats
               Table "public.t_rstats"
  Column   |  Type   | Collation | Nullable | Default
-----------+---------+-----------+----------+---------
 eid       | bigint  |           | not null |
 timestamp | integer |           | not null |
 mids      | hstore  |           |          |

我正在尝试使用 libpq 库/API 的 PQsendQuery 从 C++ 执行以下 sql 命令。

SELECT eid,timestamp,mids->'1144' AS m1144 FROM t_rstats
WHERE timestamp BETWEEN 1608638528 AND 1608638618
AND eid IN (3568,3600,4088,4120,4608,4640,5128,5160,5648,5680,6584)
ORDER BY eid,timestamp

作为参考,准备上述 sql 的部分 C++ 代码

std::vector<unsigned> metric_ids;
string selected_fields("SELECT eid,timestamp");
for (auto itor = metric_ids.begin();
     itor != metric_ids.end();
     ++itor)
{
    selected_fields += selected_fields.AppendFmt(",mids->'%u' AS m%u",*itor,*itor);
}

我收到 sqlState 错误:42601 消息:语法错误位于或接近“

我知道这是由于选择查询中的单引号引起的。请注意,当我在 psql 命令行界面上运行时,上述查询成功执行。

我试图用另一个单引号转义单引号,如下sql

SELECT eid,mids->''1144'' AS m1144 FROM t_rstats
WHERE timestamp BETWEEN 1608638528 AND 1608638618
AND eid IN (3568,timestamp

即使上面的一个失败,sqlState: 42601 消息:“1144”处或附近的语法错误

我对这个错误有点不知所措。

此外,我尝试使用以下查询方法但没有成功。在 psql 命令行上,它可以工作,但是当使用 PQsendQuery 执行时,我收到 sqlState 错误:42601 消息:语法错误位于或附近“

SELECT eid,mids->1144::TEXT AS m1144 FROM t_rstats
WHERE timestamp BETWEEN 1608638528 AND 1608638618
AND eid IN (3568,timestamp

解决方法

更新:

为 C/C++ 应用程序提供 API 以在 Postgres DB 上执行 SQL 的库 libpq 可能不支持 hstore(哈希表)扩展。但是,我能够插入到该表中并使用使用 libpq 执行的 INSERT SQL 填充 hstore 列。希望对 libpq 有命令的人确认 libpq API 不支持我的选择查询。

我发现 this 非常有用。根据答案,我重新构建了 SQL 查询如下,当我使用 libpq 库的 PQsendQuery 执行时,它可以工作。但是当我从 hstore 列中选择多个键时,结果将是窄格式,即 mids。

select eid,timestamp,key,value 
FROM (
  SELECT t.eid,t.timestamp,key::INT,value FROM t_rstats t,LATERAL each(t.mids)
  WHERE t.timestamp BETWEEN 1608638528 AND 1608638618
  AND t.eid IN (3568,3600,4088,4120,4608,4640,5128,5160,5648,5680,6584) ) x
WHERE key = 1144
ORDER BY eid,key;