我如何从给定的json获取所有“ URL”元素

时间:2019-09-16 09:01:29

标签: sql json db2 db2-400

当我在DB2实例中执行此Statement时,会得到一个名为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;

2 个答案:

答案 0 :(得分:1)

我无法使您的语法正常工作,但能够使以下语法正常工作:

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是一个类似于帖子中的数组,则可以将{"table":连接到前面,将}连接到结尾或json字符串。然后它将正确解析。

注意:"table"是一个任意名称,可以是您想要的任何名称!

其他说明:我不确定lax在路径值中的重要性,只是因为它在IBM documentation中而将其包括在内。但是,由于默认值不严格(相对于严格),因此该SQL无需使用lax就可以工作。

事实证明,如果json存在问题,则strict应该会引发错误,而lax只会忽略该行。但是,如果我在查询的路径中添加strict,则不会引发任何错误,只会返回任何行。因此,我建议仅省略两者。他们只是使SQL混乱,没有明显的好处。

答案 1 :(得分:0)

在@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;