Sud*_*ndi 5 c++ postgresql-9.5
我在 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 | | |
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)
作为参考,准备上述 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);
}
Run Code Online (Sandbox Code Playgroud)
我收到 SQLState 错误:42601 消息:位于或附近的语法错误
我知道这是由于选择查询中的单引号造成的。请注意,当我在 psql 命令行界面上运行时,上述查询成功执行。
我尝试用另一个单引号转义单引号,如下 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
Run Code Online (Sandbox Code Playgroud)
即使上面的方法也失败了,并显示 SQLState: 42601 messages: 语法错误 at or close "1144"
我对这个错误有点一无所知。
另外,我尝试使用下面的查询方法但没有成功。在 psql 命令行上,它可以工作,但是当使用 PQsendQuery 执行时,我收到 SQLState 错误:42601 消息:位于或附近的语法错误
SELECT eid, timestamp, mids->1144::TEXT 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
Run Code Online (Sandbox Code Playgroud)
更新:
为 C/C++ 应用程序提供 API 以在 Postgres DB 上执行 SQL 的库 libpq 可能不支持 hstore(哈希表)扩展。但是,我可以使用 libpq 执行的 INSERT SQL 插入到该表中并填充 hstore 列。希望使用 libpq 命令的人能够确认 libpq API 是否不支持我的选择查询。
我发现这非常有用。根据答案,我重新构建了 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, timestamp, key;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |