gpt4 book ai didi

PostgreSQL jsonb、 `?` 和 JDBC

转载 作者:行者123 更新时间:2023-11-29 11:26:20 26 4
gpt4 key购买 nike

我正在使用 PostgreSQL 9.4 和出色的 JSONB 字段类型。我正在尝试查询文档中的字段。以下在 psql CLI 中工作

SELECT id FROM program WHERE document -> 'dept' ? 'CS'

当我尝试通过我的 Scala 应用程序运行相同的查询时,出现以下错误。我正在使用 Play 框架和 Anorm,所以查询看起来像这样

SQL(s"SELECT id FROM program WHERE document -> 'dept' ? {dept}")
.on('dept -> "CS")
....

SQLException: : No value specified for parameter 5. (SimpleParameterList.java:223)

(在我的实际查询中有更多的参数)

我可以通过将我的参数转换为类型 jsonb 并使用 @> 运算符检查包含来解决这个问题。

SQL(s"SELECT id FROM program WHERE document -> 'dept' @> {dept}::jsonb")
.on('dept -> "CS")
....

我不太热衷于变通。我不知道转换是否有性能损失,但这是额外的输入,而且不明显。

还有什么我可以做的吗?

最佳答案

作为避免 ?运算符,你可以创建一个 new operator完全一样。

这是原算子的代码:

CREATE OPERATOR ?(
PROCEDURE = jsonb_exists,
LEFTARG = jsonb,
RIGHTARG = text,
RESTRICT = contsel,
JOIN = contjoinsel);

SELECT '{"a":1, "b":2}'::jsonb ? 'b'; -- true

使用不同的名称,不要有任何冲突,例如#-# 并创建一个新名称:

CREATE OPERATOR #-#(
PROCEDURE = jsonb_exists,
LEFTARG = jsonb,
RIGHTARG = text,
RESTRICT = contsel,
JOIN = contjoinsel);

SELECT '{"a":1, "b":2}'::jsonb #-# 'b'; -- true

在您的代码中使用这个新运算符,它应该可以工作。

检查 pgAdmin -> pg_catalog -> Operators 所有使用 ?在名称中。

关于PostgreSQL jsonb、 `?` 和 JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27573778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com