【问题标题】:Extracting value from curly bracket SQL从大括号 SQL 中提取值
【发布时间】:2019-10-18 10:01:33
【问题描述】:

我正在尝试弄清楚如何从 Prestosql 的列中的大括号中提取值。

字段看起来像,

rates
{"B":750}
{"B":1600}
{"B":900}

我只想提取每个括号中的数值。 另外,如果我想将它除以 10 然后除以 20 会很容易添加到查询中吗?

rates 列的类型为 map(varchar, bigint)

【问题讨论】:

  • 要提取数字,您可以使用正则表达式,例如:SELECT regexp_extract('{"B":750}', '\d+')。检查此链接以供参考:prestodb.github.io/docs/current/functions/regexp.html
  • rates 列的类型是什么?是 varchar、JSON 还是其他? (如果这是一些复杂的表达式,您可以使用select typeof(rates) from ... limit 1 进行检查)
  • @PiotrFindeisen 谢谢!是varchar,bigint类型是什么意思?
  • 我不确定我是否理解。也许在您的问题中包含select typeof(rates) from ... limit 1 的完整输出。
  • @Chris90 感谢您提供类型信息。我在此基础上添加了一个答案。如果您有更具体的需求,请在问题中提供示例预期输出。

标签: sql data-science data-analysis presto trino


【解决方案1】:

由于rates 列的类型为map(varchar, bigint)。你可以在上面使用Presto Map Functions and Operators。例子:

SELECT rates['B'] FROM ... -- value under key "B"
SELECT map_values(rates) FROM ... -- all values in a map

Presto documentation 中查看更多信息。

【讨论】:

  • 那么如果我只想要数字值而不考虑括号中的任何字母或单词怎么办?谢谢!
  • 另外,结果会像 [100] 或 [1000] 一样出现,我如何从输出列中删除这些括号?
  • 您的地图是否始终只包含一个键/值对?
  • 只纠正一个
  • @Chris90 您可以使用...[1] 从数组中获取唯一元素,因此在您的情况下,这将是map_values(rates)[1]
【解决方案2】:

使用类似的方法,regexp_extract 函数从字符串中提取数字,cast 函数将其从字符串转换为数字,然后您可以继续除以 10 等。

select cast(regexp_extract(rates, '\d+') as double) / 10
from my_table

【讨论】:

  • double 是带小数位的数字,如果不需要小数位,可以使用 int
  • 谢谢,我试过你的方法。我得到这个错误。函数 regexp_extract 的意外参数 (map(varchar,bigint), varchar(3))。预期:regexp_extract(varchar(x), JoniRegExp) , regexp_extract(varchar(x), JoniRegExp, bigint)
  • 改用cast(regexp_extract(json_format(JSON rates), '\d+') as double) / 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多