【问题标题】:SQL: Parse JSONSQL:解析 JSON
【发布时间】:2012-07-23 23:25:56
【问题描述】:

使用 SQL,我如何从下面的 JSON 中选择“conversion_event”的值?

{"str":[1,1342886173,100000627571405,"offsite_conversion.lead",{"action.type":"offsite_conversion","conversion_event":387756207950188,"tag":"lead"},["conversion_event"],[],{"amount":12623486},"1:11:1:0:0:1:0"]}  

这里有一些不寻常的东西,例如 JSON 中的 JSON 和方括号。假设所有值的长度因行而异,因此您不能按一组字符位置进行切片。

【问题讨论】:

  • 您真的必须在 SQL 中执行此操作吗?就像试图用汽车引擎敲钉子一样
  • 有两个你要哪一个?
  • 我尝试使用“LATERAL VIEW JSON_TUPLE”来操作它,但这听起来像是 Hive 特有的解决方案,而不是 SQL 中的最佳方式。
  • @Bort 不幸的是,我确实需要使用 SQL。
  • 您使用的是什么数据库?如果这是 TSQL 你可以写一个 CLR 函数来做到这一点没问题,我不知道其他人

标签: sql arrays json parsing


【解决方案1】:

基于 cmets:

declare @astr varchar(max);
declare @start int;
declare @end int;
set @astr = '{"str":[1,1342886173,100000627571405,"offsite_conversion.lead",{"action.type":"offsite_conversion","conversion_event":387756207950188,"tag":"lead"},["conversion_event"],[],{"amount":12623486},"1:11:1:0:0:1:0"]}';

select @start =  charindex('"conversion_event":',@astr)
select @end = charindex(',"tag":',@astr)

select substring(@astr,@start,@end-@start);

返回

"conversion_event":387756207950188

添加

set @start = @start + 19;

只获取数字。


SELECT substring('{"str":[1,1342886173,100000627571405,"offsite_conversion.lead",{"action.type":"offsite_conversion","conversion_event":387756207950188,"tag":"lead"},["conversion_event"],[],{"amount":12623486},"1:11:1:0:0:1:0"]}',
                  101,16);

select substring('{"str":[1,1342886173,100000627571405,"offsite_conversion.lead",{"action.type":"offsite_conversion","conversion_event":387756207950188,"tag":"lead"},["conversion_event"],[],{"amount":12623486},"1:11:1:0:0:1:0"]}',
                 151,16)

好的,这是对象的结构:

{
  "str":[1,
         1173,
         10005,
         "offsite_conversion.lead",
         {"action.type":"offsite_conversion",
          "conversion_event":387756207950188,
          "tag":"lead"},
        ["conversion_event"],
        [],
        {"amount":14486},
        "1:11:1:0:0:1:0"
]}

具有str 属性的对象,它是一个数组。

第5个元素有第2个属性转换事件

第6个元素是一个元素的数组,是转换事件。

所以问题是……这个结构是一样的吗?你想要哪一个?

【讨论】:

  • 谢谢霍根 - 但不幸的是,许多值的长度会因行而异,所以我不能使用设置位置进行切片。
  • :P 我想要第一个转换事件的值,在本例中为“387950188”。
  • 所以你想要387756207950188?而且结构不变?
  • 正确。我总是想要由第一个“conversion_event”键入的值
  • 很好的调用来匹配字符串。
猜你喜欢
  • 2021-09-28
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多