问题描述
\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
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 命令行界面上运行时,上述查询成功执行。
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;