[英]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
時,字段名稱將成為鍵。JSON
: CAST(... 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.