簡體   English   中英

如何用presto中的json字符串中的列名替換參數值

[英]How to replace parameter values with column name in a json string in presto

我有一個名為sampleTable的表,其值是這樣的(請注意,列最多可以是 key100,說明一個小示例以降低示例的復雜性)。

select * from sampleTable;
鑰匙 1 鑰匙2
1111 2222

我正在嘗試生成一個查詢,該查詢創建一個 JSON 字符串,該字符串可以將這些列值包含到每行一個 JSON 字符串中,如下面提到的格式。

 '{"keys":{"key1":"1111", "key2":"2222"}}'

通過 presto 查詢執行此操作的正確方法是什么? 我的嘗試如下:

嘗試 1

select 
    concat('{"keys":{"key1": ', a.key1, ',',
    '{"key2": ' ,a.key2, '}}') 
    AS keyJson 
from sampleTable ;

嘗試 2

select 
    replace(
        replace('{"keys":{"key1": $key1, "key2": $key2}}','$key1',d.key1), 
        '$key2',d.key2 ) 
    AS keyJson 
from sampleTable ; 

考慮到密鑰可以從 key1 到 key100,有沒有更簡單的方法可以做到這一點。 對於上下文,我從 Java 程序動態生成查詢。 在存在多個鍵的情況下,在這兩種情況下使用 StringBuilder 方法附加字符串變得復雜。

慣用的方法是構造一個ROW值,然后將其轉換為JSON

  • 首先,從列中構造一行: row(key1, key2, key3) 這將產生一個匿名行類型(即具有未命名字段的行)
  • 其次,將值轉換為具有命名字段的行: CAST(... AS ROW(key1 VARCHAR, key2 VARCHAR, key3 VARCHAR)) 當行轉換為JSON時,字段名稱將成為鍵。
  • 最后,將結果值轉換為JSONCAST(... AS JSON)

這是一個完整的例子:

WITH data(key1, key2, key3) AS (
    VALUES
        ('1111', '2222', '3333')
)
SELECT
    CAST(
        CAST(row(key1, key2, key3) AS ROW(key1 VARCHAR, key2 VARCHAR, key3 VARCHAR)) AS JSON)
FROM data

它產生:

                    _col0
---------------------------------------------
 {"key1":"1111","key2":"2222","key3":"3333"}
(1 row)

使用Trino 359以前稱為 PrestoSQL )進行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM