【问题标题】:Redshift SQL - Extract numbers from stringRedshift SQL - 从字符串中提取数字
【发布时间】:2014-03-22 05:27:37
【问题描述】:

在 Amazon Redshift 表中,我有一个字符串列,我只需要从中提取数字。为此,我目前使用

translate(stringfield, '0123456789'||stringfield, '0123456789')

我正在尝试 REPLACE 功能,但它不会很优雅。

有什么想法先将字符串转换为 ASCII,然后进行一些操作以仅提取数字?或任何其他替代方案。 这里很难,因为 Redshift 不支持函数并且缺少很多传统函数。

编辑: 尝试以下,但它只返回 051-a92 ,因为我需要 05192 作为输出。我正在考虑子字符串等,但我现在只有 regexp_substr 可用。如何摆脱介于两者之间的任何字符

select REGEXP_SUBSTR('somestring-051-a92', '[0-9]+..[0-9]+', 1)

【问题讨论】:

  • 最好在放入 Redshift 之前对其进行解析 - 更多功能、更好的性能、更低的成本...
  • @Guy “更多功能、更好的性能、更低的成本……”嗯?您是否调查过大多数分析数据库(Teradata、Vertica 等)的成本? Redshift 便宜,SSD节点
  • @JoeHarris,我同意 Redshift 的成本非常低,但这并不意味着您应该用长文本列填充它。如果您可以将它们解析为更具分析性的形式(数字、类别、日期...),则更具可扩展性和成本效益。

标签: sql regex data-conversion amazon-redshift


【解决方案1】:

可能会迟到,但我正在解决同样的问题,最后想出了这个

select REGEXP_replace('somestring-051-a92', '[a-z/-]', '')

或者,您现在可以创建 Python UDF

【讨论】:

  • REGEXP_replace(value, '[A-Z/-]|[a-z/-]')
【解决方案2】:

通常,您的输入将符合某种模式,可用于使用SUBSTRING()CHARINDEX() { aka STRPOS(), POSITION() } 进行解析。

例如找到第一个连字符和第二个连字符并取它们之间的数据。

如果不是(并且假设您的字符范围仅限于 ASCII),那么您最好的办法是嵌套 26 个以上 REPLACE() 函数以删除所有标准字母字符(以及任何标点符号)。

如果您的数据中有多字节字符,那么这不是首发。

【讨论】:

  • 如果里面有多字节字符怎么办?
  • 哈,这不是首发!如果你真的有多字节字符,那么这些可能应该在上游某个地方被拆分。
【解决方案3】:

您可以指定“任何非数字”,包括不可打印、符号、字母等。

例如,regexp_replace('brws--A*1','[\D]')

返回 “1”

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2023-03-25
    • 2021-08-07
    • 2021-12-08
    • 1970-01-01
    • 2020-07-02
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多