postgresql - 检查范围是否包含在 PQexecPrepared 中损坏的值(在 psql 中工作)
问题描述
我有这个(相当丑陋的,生成的)准备好的语句来获取一些游戏数据。我尝试通过执行以下操作检查值($3)是否包含在spawn_level_range
(这是一个int4range
)中$3<@quests.spawn_level_range
:
SELECT quests.id,
quests.base_attack,
quests.base_strg,
quests.base_accy,
quests.base_hp,
quests.name,
quests.task,
quests.image_url,
quests.spawn_chance
FROM quests
WHERE (((quests.server_id=$1)
AND ((quests.channel_id='all') OR (quests.channel_id=$2)))
AND ($3<@quests.spawn_level_range))
ORDER BY RANDOM()
LIMIT 1;
当我添加以下内容时,这个确切的查询可以完美地工作psql
:
prepare test (varchar, varchar, int) AS
然后运行它:
execute test('669105577238069249', '682205516667158549', 1);
但是,由于某种原因,它在 libpq 中不起作用。
使用 运行语句时PQexecPrepared
,会引发错误:
ERROR: malformed range literal: "1"
DETAIL: Missing left parenthesis or bracket.
(请注意,这1
就是我要绑定$3
的内容)
似乎它试图解释$3
为一个范围(而不是一个integer
)——这对我来说似乎是一个错误。
解决方案
在您准备好的语句中,您将第三个参数显式声明为integer
.
在您的PQprepare
调用(您没有显示)中,您一定忽略了设置paramTypes
参数以指示参数的类型,因此它们都是unknown
PostgreSQL 的,它从上下文中推断出数据类型。
现在有两个<@
范围运算符:
anyrange <@ anyrange
anyelement <@ anyrange
不知道你想要哪一个,PostgreSQL 的数据类型解析规则更喜欢两边数据类型相同的运算符。
有两种可能的解决方案:
paramTypes
在参数中指定正确的类型PQprepare
- 向查询添加显式类型转换:
CAST ($3 AS integer)
推荐阅读
- oracle - 在 SQL PLUS 中运行多个查询
- vbscript - VBscript SendKeys 在 RemoteConnection 中不起作用
- c - C - 使用 _Alignas 说明符强制对齐 - 为什么要填充内存?
- spring-boot - 如何针对特定情况禁用zuul过滤器而不发送到映射的URL
- reactjs - React - 在离开页面之前保存工作
- nginx - Nginx 不会以在上游找不到的主机启动
- python - 模块“pip”没有属性“pep425tags”
- kubernetes - 有没有办法将 Kubernetes 秘密值放在 yaml 文件的 args 字段中
- php - PHP 检查 $model 是否是众多类之一的实例
- python - 删除另一个标签 beautifulsoup 中的标签