我如何从给定的 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;