红移SQL-从字符串中提取数字
在Amazon红移表中,我有一个字符串列,我只需要从中提取数字。为此,我目前使用红移SQL-从字符串中提取数字,sql,regex,data-conversion,amazon-redshift,Sql,Regex,Data Conversion,Amazon Redshift,在Amazon红移表中,我有一个字符串列,我只需要从中提取数字。为此,我目前使用 translate(stringfield, '0123456789'||stringfield, '0123456789') 我试过替换功能,但不会很优雅 有没有想过先将字符串转换成ASCII,然后再进行一些操作来提取唯一的数字?或任何其他选择。 这里很难做到,因为红移不支持函数,并且缺少很多传统函数 编辑: 尝试下面的方法,但它只返回051-a92,因为我需要05192作为输出。我正在考虑子字符串等,但我现在
translate(stringfield, '0123456789'||stringfield, '0123456789')
我试过替换功能,但不会很优雅
有没有想过先将字符串转换成ASCII,然后再进行一些操作来提取唯一的数字?或任何其他选择。
这里很难做到,因为红移不支持函数,并且缺少很多传统函数
编辑:
尝试下面的方法,但它只返回051-a92,因为我需要05192作为输出。我正在考虑子字符串等,但我现在只有regexp\u substr可用。我如何摆脱中间的角色
select REGEXP_SUBSTR('somestring-051-a92', '[0-9]+..[0-9]+', 1)
通常,您的输入将符合某种模式,可以使用
SUBSTRING()
和CHARINDEX(){aka STRPOS(),POSITION()}
进行解析
例如,找到第一个连字符和第二个连字符,并在它们之间提取数据
如果不是(并且假设您的字符范围限制为ASCII),则最好嵌套26+REPLACE()
函数以删除所有标准字母字符(以及任何标点符号)
如果您的数据中有多字节字符,则这是非起始字符。您可以指定“任何非数字”,其中包括不可打印字符、符号、字母等
e、 例如,regexp_replace('brws--A*1','[\D]'))
返回
“1”可能会迟到,但我解决了同样的问题,终于想出了这个办法
选择REGEXP\u replace('somestring-051-a92','a-z/-]','')
或者,您现在可以创建一个Python UDF更好地在放入红移之前解析它-更多功能,更好的性能,更低的成本…@Guy“更多功能,更好的性能,更低的成本…”哈?您是否曾经调查过大多数分析数据库(Teradata、Vertica等)的成本?红移很便宜,SSD节点也很快。@JoeHarris,我同意红移的成本很低,但这并不意味着你应该用长文本列来填充它。如果你能将它们解析成更具分析性的形式(数字、类别、日期……),它的可扩展性和成本效益会更高。如果我在其中包含多字节字符呢?哈,这是一个非初学者!如果您真的有多字节字符,那么这些字符可能应该被拆分到上游某个位置。