如何使用另一个字段的值作为postgresql中jsonb查询的键

问题描述 投票:0回答:1

我有一个部门表,其中有一个 jsonb 字段,该字段给出了如下所示的营业时间:

{
            "Friday": {
                "closeTime": "1970-01-01T17:00:00.000Z",
                "isOpen": true,
                "isOpen24Hours": false,
                "openTime": "1970-01-01T08:00:00.000Z"
            },
            "Monday": {
                "isOpen": false
            },
            "Saturday": {
                "isOpen": false
            },
            "Sunday": {
                "isOpen": false
            },
            "Thursday": {
                "closeTime": "1970-01-01T17:00:00.000Z",
                "isOpen": true,
                "isOpen24Hours": false,
                "openTime": "1970-01-01T08:00:00.000Z"
            },
            "Tuesday": {
                "closeTime": "1970-01-01T17:00:00.000Z",
                "isOpen": true,
                "isOpen24Hours": false,
                "openTime": "1970-01-01T08:00:00.000Z"
            },
            "Wednesday": {
                "closeTime": "1970-01-01T17:00:00.000Z",
                "isOpen": true,
                "isOpen24Hours": false,
                "openTime": "1970-01-01T08:00:00.000Z"
            }
        }

我有另一个表,将一天中的某些活动与某个部门相关联,我想知道活动发生当天该部门是否开放。那么如何用另一个表中的日期的星期几查询这个 jsonb 字段呢?

我尝试过类似的事情:

select a.activity_date, a.department_id, 
d.hours_of_operation->to_char(a.activity_date, 'Day')->>'isOpen' as isOpen
from activity a
join department d on a.department_id = d.id

但仅当 Activity_date 是星期三时才返回 isOpen 值(这是 hours_of_operation jsonb 中的最后一个键)

json postgresql jsonb
1个回答
0
投票

您可能忽略了

Day
模板

附带的空白填充

DAY
完整大写的日期名称 (空白填充至 9 个字符)
Day
全大写的日期名称 (空白填充至 9 个字符)
day
完整的小写日期名称 (空白填充至 9 个字符)

这意味着只有

Wednesday
没有任何空格,因为它已经有 9 个字符长了:demo

select quote_literal(to_char(a.activity_date, 'Day'))
      ,a.activity_date
      ,a.department_id
      ,(d.hours_of_operation->to_char(a.activity_date, 'Day'))->>'isOpen' as isOpen
from activity a
join department d on a.department_id = d.id
quote_literal 活动日期 部门_id 已开放
'Wednesday'
2024-04-24 1 真实
'Tuesday  '
2024-04-23 1
'Monday   '
2024-04-22 1
'Sunday   '
2024-04-21 1
'Saturday '
2024-04-20 1
'Friday   '
2024-04-19 1
'Thursday '
2024-04-18 1
'Wednesday'
2024-04-17 1 真实

加个

trim()
就可以了:

select quote_literal(trim(to_char(a.activity_date, 'Day')))
      ,a.activity_date
      ,a.department_id
      ,(d.hours_of_operation->trim(to_char(a.activity_date, 'Day')))->>'isOpen' as isOpen
from activity a
join department d on a.department_id = d.id
quote_literal 活动日期 部门_id 已开放
'Wednesday'
2024-04-24 1 真实
'Tuesday'
2024-04-23 1 真实
'Monday'
2024-04-22 1
'Sunday'
2024-04-21 1
'Saturday'
2024-04-20 1
'Friday'
2024-04-19 1 真实
'Thursday'
2024-04-18 1 真实
'Wednesday'
2024-04-17 1 真实
© www.soinside.com 2019 - 2024. All rights reserved.