删除 JSON_AGG(聚合函数)中的括号和引号

Posted

技术标签:

【中文标题】删除 JSON_AGG(聚合函数)中的括号和引号【英文标题】:Remove bracket and quotations in JSON_AGG (Aggregate Functions) 【发布时间】:2021-10-25 04:27:44 【问题描述】:
public function fetchdrug(Request $search_drug)

    $filter_drug = $search_drug->input('search_drug');
    $all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('DISTINCT ON (drug_code)
                                                    drug_code,
                                                    drug_name,
                                                    JSON_AGG(drug_dosage) AS dosage_list')
                                ->GroupBy('drug_code', 'drug_name')
                                ->orderBy('drug_code', 'ASC')
                                ->get();

    return response()->json([
        'all_drugs'=>$all_drugs,
    ]);

我正在使用JSON_AGG 检索多行drug_dosage 并将它们合并为一个,但我的输出中出现了括号和引号,我该如何取出?

更新: 我在示例中遇到错误,因为我正在尝试使用 str_replacepreg_replace 的解决方案。我的问题是目标在 SQL 语句中,所以我怀疑这与错误有关,因为结果中有其他数据 错误:

  Uncaught TypeError: Cannot use 'in' operator to search for 'length' in 
"drug_code":"CFZU",
 "drug_name":"Cefazolin",
 "dosage_list":"[\"<=4 mg\/L\", \"<=3 mg\/L\"]", 
"drug_code":"TZPD","drug_name":"Pip\/Tazobactam",
 "dosage_list":"[\"Pip\/Tazobactam\"]"

【问题讨论】:

您很可能会得到其他不需要的字符,例如\\\n 等。JSON_AGG 不是正确的函数。 【参考方案1】:

你可以试试string_agg 代替JSON_AGG

public function fetchdrug(Request $search_drug)

$filter_drug = $search_drug->input('search_drug');
$all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('DISTINCT ON (drug_code)
                                                drug_code,
                                                drug_name,
                                                string_agg(drug_dosage, ', ') AS dosage_list')
                            ->GroupBy('drug_code', 'drug_name')
                            ->orderBy('drug_code', 'ASC')
                            ->get();

return response()->json([
    'all_drugs'=>$all_drugs,
]);

【讨论】:

这是一个 PostgreSQL 不兼容其他 SQL。你需要改变。【参考方案2】:

因为:JSON_AGGJSON ARRAY 返回为 STRING。之后,您从控制器返回 json 编码结果。这会为制作有效的 json 编码添加不需要的字符。 (嵌套引号必须转义)。

所以;

在发送结果之前,您必须json_decode每条记录的drug_dosage字段

示例代码:

public function fetchdrug(Request $search_drug)
   $filter_drug = $search_drug->input('search_drug');
   $all_drugs = HmsBbrKnowledgebaseDrug::selectRaw('DISTINCT ON (drug_code)
                                                drug_code,
                                                drug_name,
                                                string_agg(drug_dosage, ', ') AS dosage_list')
                            ->GroupBy('drug_code', 'drug_name')
                            ->orderBy('drug_code', 'ASC')
                            ->get();

   foreach($all_drugs as $drug)
       //decode postgresql 'json array like string presentation' to array.
       $decoded = json_decode($drug->drug_dosage);
       // if you want to remove null/empty values use array_filter 
       $filtered = array_filter($decoded); // default behavior removes falsy values.
       // use same field to hold wanted, structured values
       $drug->drug_dosage = $filtered;
   
   
   // And return as json response like before.
   return response()->json([
    'all_drugs'=>$all_drugs,
   ]);


【讨论】:

以上是关于删除 JSON_AGG(聚合函数)中的括号和引号的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql LEFT JOIN json_agg() 忽略/删除 NULL

print()函数与转义字符

如何从 JSON 字符串中删除括号和引号

sublime text 3怎么快速删除成对的括号或引号

VB里面有些运行函数加括号和加引号有啥区别

从视图中删除方括号和引号,导轨 3