当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL教义:如果包含值数组的jsonb字段包含传递的值,如何选择行

应子真
2023-03-14

我在PostgreSQL上。

我有一个条令实体fruitentity,其中有两个字段:

  • id主键是字母数字字符串(例如:apple);
  • aliases是一个JSONB字段,包含一个替代ID列表:(例如:[“orange”,“banana”,“cherry”]

如果传递值banana,我希望选择ID为apple的行。

因此,这是fruitrepository类(我在Symfony上):

class FruitRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, FruitEntity::class);
    }

    public function myMethod(string $fruitName)
    {
        $result = $this->createQueryBuilder('f')
            ->select('f.id')
            ->andWhere('f.id = :fruitName')
            ->orWhere("JSON_EXTRACT(f.aliases, '$.:fruitName')")
            ->setParameter('fruitName', $fruitName)
            ->getQuery()
            ->getScalarResult();

        ...
    }
}

此代码生成以下DQL查询:

SELECT f.id FROM App\Entity\FruitEntity f WHERE f.id = :fruitName OR JSON_EXTRACT(f.aliases, '$.:fruitName')

这显然是错误的,它产生的错误是这样的

注意:试图访问null类型值的数组偏移量

如何选择ID为apple并传递orange值的行,该行存在于aliases列中?

共有1个答案

壤驷华美
2023-03-14

好的,最后我是这样解决的:

        $result = $this->createQueryBuilder('f')
            ->select('f.id')
            ->andWhere('c.id = :fruitName')
            ->orWhere("JSONB_CONTAINS(f.aliases, '\"" . $fruitName . "\"') = true")
            ->setParameter('fruitName', $fruitName)
            ->getQuery()
            ->getScalarResult();

在使用这些函数时似乎没有对参数进行转换。

另外请注意,我使用了jsonb_contains而不是json_extract

仅供参考,我显然使用了scienta/dociety-json-functions

 类似资料:
  • 问题内容: 如果我有一张桌子 如何通过task_id获取分组的行,该行的状态仅为NULL。在这种情况下,只有具有task_id 2的行。 问题答案: 执行,以返回仅具有空状态的task_id。

  • 问题内容: 我正在使用ADO从Excel工作簿导入数据。我在一个工作表上遇到麻烦,其中一个列名包含一个点:“ Col.1”。 我尝试了所有发现的东西:双引号,方括号,后卫。什么都行不通。会引发错误,或者在每行上查询输出“ Col.1”。 鉴于我无法重命名源文件中的列, 如何使用其名称而不是其编号([F1])手动选择此列? 问题答案: 我终于找到了如何从此列中检索数据。 您需要 替换“。” 按“#”

  • 问题内容: 在SQL Server 2005中,我有一个包含订单ID和产品ID的订单详细信息表。我想编写一条sql语句,查找具有特定订单内所有项目的所有订单。因此,如果订单5包含项1、2和3,则我希望所有其他订单也具有1、2和3。此外,如果订单5具有2次两次和3次一次,则我希望所有其他订单具有两个2和一个3。 我的偏爱是它返回完全匹配的订单,但是,如果这样更容易执行/性能更好,则可以接受超集订单。

  • 我试图在ElasticSearch中运行类似的字段查询:

  • 目前 我在DynamoDB中有一个表,其中有一个属性-主键-包含唯一的值。 问题 我希望对#B#C#(1)精确匹配和(2)包含匹配进行2次搜索,因此只需要结果: 是否可以针对主键进行这2次搜索 如果是这样,运行哪种查询最有效?e、 g.查询或扫描 注: 对于(2),我使用以下代码,但它返回DB中的所有项:

  • 我正在尝试将csv文件中的值映射到RDD,但我收到以下错误,因为某些字段为空。 线程"main"中的异常org.apache.spark.SparkException:由于阶段失败而中止的作业:阶段0.0中的任务0失败1次,最近的失败:阶段0.0中丢失的任务0.0(TID 0,localhost,执行驱动程序):java.lang.NumberFormatException:空字符串 以下是我正在