我如何从给定的 json 中获取所有 "url" 元素
How can i get all "url" elements from the given json
当我在我的 DB2 实例中执行此语句时,我得到一个名为 url 的空列。但我在我的专栏中排除了 2 行。为什么它不起作用,我该如何解决?
select t.url
from JSON_TABLE('
[{"id": "286", "url": "https://25.media.tumblr.com/tumblr_lh3j390T241qfyzelo1_250.jpg"},
{"id": "2dd", "url": "https://24.media.tumblr.com/hA6zECTlEg4sfljwHQf5jm4So1_250.jpg"}
]','$[*]' columns (url varchar(100) PATH '$.url')
) as t;
我无法使您的语法起作用,但我能够使以下语法起作用:
select *
from JSON_TABLE('{"table":
[{"id": "286", "url": "https://25.media.tumblr.com/tumblr_lh3j390T241qfyzelo1_250.jpg"},
{"id": "2dd", "url": "https://24.media.tumblr.com/hA6zECTlEg4sfljwHQf5jm4So1_250.jpg"}
]}', 'lax $.table[*]'
columns (url VARCHAR(100) PATH 'lax $.url')
) as t;
有两件事。 json 似乎需要包含在 {}
中,并且根据我的测试,数组必须命名(例如 "table": []
)。
如果您必须处理的 json 是一个类似于 post 中的数组,您可以将 {"table":
连接到前面,将 }
连接到最后或您的 json 字符串。然后它将正确解析。
注意: "table"
是任意名称,可以是任何您想要的名称!
补充说明: 我不确定 lax
在路径值中的重要性,并将其包括在内只是因为它在 IBM documentation .但是,由于 lax 是默认设置(相对于 strict),这个 SQL 可以在没有 lax
的情况下工作。
事实证明,如果 json 有问题,strict 应该抛出错误,而 lax 只是忽略该行。但是,如果我对查询中的路径添加严格,则不会引发任何错误,只是不会返回任何行。所以,我建议只省略两者。它们只会让 sql 变得杂乱无章,没有明显的好处。
在@jmarkmurphy 的帮助下,我终于想到了这个。
with cats as(
select '{"table":' || systools.HTTPGETCLOB('https://api.thecatapi.com/v1/images/search?limit=20&page=1&size=small',
cast ('<httpHeader><header name="X-Api-Key" value="b7215c66-a930-4b62-a276-064f956ed64b"/></httpHeader>' as clob(1K))) || '}' as json
from sysIbm.sysDummy1)
--
select t.url
from cats,
JSON_TABLE(cats.json, 'lax $.table[*]' columns (url VARCHAR(100) PATH 'lax $.url')) as t;
当我在我的 DB2 实例中执行此语句时,我得到一个名为 url 的空列。但我在我的专栏中排除了 2 行。为什么它不起作用,我该如何解决?
select t.url
from JSON_TABLE('
[{"id": "286", "url": "https://25.media.tumblr.com/tumblr_lh3j390T241qfyzelo1_250.jpg"},
{"id": "2dd", "url": "https://24.media.tumblr.com/hA6zECTlEg4sfljwHQf5jm4So1_250.jpg"}
]','$[*]' columns (url varchar(100) PATH '$.url')
) as t;
我无法使您的语法起作用,但我能够使以下语法起作用:
select *
from JSON_TABLE('{"table":
[{"id": "286", "url": "https://25.media.tumblr.com/tumblr_lh3j390T241qfyzelo1_250.jpg"},
{"id": "2dd", "url": "https://24.media.tumblr.com/hA6zECTlEg4sfljwHQf5jm4So1_250.jpg"}
]}', 'lax $.table[*]'
columns (url VARCHAR(100) PATH 'lax $.url')
) as t;
有两件事。 json 似乎需要包含在 {}
中,并且根据我的测试,数组必须命名(例如 "table": []
)。
如果您必须处理的 json 是一个类似于 post 中的数组,您可以将 {"table":
连接到前面,将 }
连接到最后或您的 json 字符串。然后它将正确解析。
注意: "table"
是任意名称,可以是任何您想要的名称!
补充说明: 我不确定 lax
在路径值中的重要性,并将其包括在内只是因为它在 IBM documentation .但是,由于 lax 是默认设置(相对于 strict),这个 SQL 可以在没有 lax
的情况下工作。
事实证明,如果 json 有问题,strict 应该抛出错误,而 lax 只是忽略该行。但是,如果我对查询中的路径添加严格,则不会引发任何错误,只是不会返回任何行。所以,我建议只省略两者。它们只会让 sql 变得杂乱无章,没有明显的好处。
在@jmarkmurphy 的帮助下,我终于想到了这个。
with cats as(
select '{"table":' || systools.HTTPGETCLOB('https://api.thecatapi.com/v1/images/search?limit=20&page=1&size=small',
cast ('<httpHeader><header name="X-Api-Key" value="b7215c66-a930-4b62-a276-064f956ed64b"/></httpHeader>' as clob(1K))) || '}' as json
from sysIbm.sysDummy1)
--
select t.url
from cats,
JSON_TABLE(cats.json, 'lax $.table[*]' columns (url VARCHAR(100) PATH 'lax $.url')) as t;