【问题标题】:how to write a json in middle of union functionality throwing error如何在联合功能抛出错误的中间编写一个json
【发布时间】:2021-09-30 15:10:58
【问题描述】:

我在union中间写了一个union函数写了一个json对象是参数之一,但是抛出错误:could not identify an equal operator for type json。这是我的代码。

select(SELECT array_to_json(array_agg(row_to_json(resdt))) FROM 
                        (select  vt.task_id,vp.project_name,vp.status as project_status,
                 vt.project_id,vt.task_description,vt.planned_start_date,vt.planned_end_date,
        (select array_to_json(array_agg(row_to_json(b))) FROM   
         (select vl.* 
            from  public."VOfficeApp_task" vat
            inner join public."VOfficeApp_task_labels" vtl on vat.task_id = vtl.task_id
            inner join  public."VOfficeApp_labels" vl on  vl.label_id = vtl.label_id
            where vl.status = true
            and vat.task_id = vt.task_id
     )b)as label_name,
        
             (select array_to_json(array_agg(row_to_json(b))) FROM
                     (select tr.task_resource_id,tr.task_id,tr.project_resource_id ,
                             tr.assigned_date,tr.assigned_by,pr.employee_id as id,
                             concat(u.first_name,u.last_name) as employeename
                             from public."VOfficeApp_task" vtr
                             inner join public."VOfficeApp_project_resources" pr on pr.project_id = vtr.project_id
                             inner join public."VOfficeApp_task_resource" tr on tr.project_resource_id = pr.project_resource_id
                             and tr.task_id = vt.task_id
                             inner join public."VOfficeApp_user" u on u.id =pr.employee_id
                             where tr.released_date is null and vtr.task_id =vt.task_id
                             and vtr.status != 'Delete')b)as user_name,
    (select count(task_id)from  public."VOfficeApp_task" ptra
                     where  ptra.task_id = vt.task_id
                     and status = 'Assigned')Active_count,


                 from public."VOfficeApp_task" vt 
                 inner join public."VOfficeApp_projects" vp on vt.project_id = vp.project_id
                 inner join public."VOfficeApp_task_resource" vtr on vt.task_id = vtr.task_id
                 inner join  public."VOfficeApp_project_resources" vpr on vtr.project_resource_id = vpr.project_resource_id
                 left join public."VOfficeApp_conversation" cvv on cvv.projtaskid = vt.task_id
                
                 where vp.company_id = companyid 
                 and vp.created_by = createdby
                 and vt.status != 'Delete'    
                --order by vt.task_id desc

工会 选择 vt.task_id,vp.project_name,vp.status 作为 project_status, vt.project_id,vt.task_description,vt.planned_start_date,vt.planned_end_date,

      (select array_to_json(array_agg(row_to_json(b))) FROM
         (select vl.* 
            from  public."VOfficeApp_task" vat
            inner join public."VOfficeApp_task_labels" vtl on vat.task_id = vtl.task_id
            inner join  public."VOfficeApp_labels" vl on  vl.label_id = vtl.label_id
            where vl.status = true
            and vat.task_id = vt.task_id
     )b)as label_name,
                         (select array_to_json(array_agg(row_to_json(b))) FROM
                     (select tr.task_resource_id,tr.task_id,tr.project_resource_id ,
                             tr.assigned_date,tr.assigned_by,pr.employee_id as id,
                             concat(u.first_name,u.last_name) as employeename
                             from public."VOfficeApp_task" vtr
                             inner join public."VOfficeApp_project_resources" pr on pr.project_id = vtr.project_id
                             inner join public."VOfficeApp_task_resource" tr on tr.project_resource_id = pr.project_resource_id
                             and tr.task_id = vt.task_id
                             inner join public."VOfficeApp_user" u on u.id =pr.employee_id
                             where tr.released_date is null and vtr.task_id =vt.task_id
                             and vtr.status != 'Delete')b)as user_name,
         
                    from public."VOfficeApp_task" vt 
                    inner join public."VOfficeApp_projects" vp on vt.project_id = vp.project_id
                    inner join public."VOfficeApp_task_resource" vtr on vt.task_id = vtr.task_id
                    inner join  public."VOfficeApp_project_resources" vpr on vtr.project_resource_id = vpr.project_resource_id
                    --inner join public."VOfficeApp_user" u on u.id =vpr.employee_id
                    where vp.company_id = companyid and vpr.employee_id = createdby
                    and  vt.status != 'Delete'  
                    --order by vt.task_id desc
                         
                )resdt)as My_tasks;

【问题讨论】:

    标签: arrays json postgresql postgresql-9.3 pgadmin


    【解决方案1】:

    正如消息所暗示的,json 没有定义相等运算符,并且需要其中之一来实现 UNION 的重复数据删除功能。并且 json 没有规范化它的值,所以它甚至不清楚平等的明确定义是什么。 '{"a":"b","c":"d"}' 是否应该被认为与 '{"c":"d","a":"b"}' 不同?

    您可以升级到支持的数据库版本,然后使用 jsonb 而不是 json。这确实定义了一个相等运算符,并将上面的两个示例视为相同。

    如果重复数据删除对您来说不是必需的,您可以将 UNION 更改为 UNION ALL。

    您可以将 json 转换为每个 SELECT 中的文本。这将两个示例视为不同。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多