Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
红移SQL-从字符串中提取数字_Sql_Regex_Data Conversion_Amazon Redshift - Fatal编程技术网

红移SQL-从字符串中提取数字

红移SQL-从字符串中提取数字,sql,regex,data-conversion,amazon-redshift,Sql,Regex,Data Conversion,Amazon Redshift,在Amazon红移表中,我有一个字符串列,我只需要从中提取数字。为此,我目前使用 translate(stringfield, '0123456789'||stringfield, '0123456789') 我试过替换功能,但不会很优雅 有没有想过先将字符串转换成ASCII,然后再进行一些操作来提取唯一的数字?或任何其他选择。 这里很难做到,因为红移不支持函数,并且缺少很多传统函数 编辑: 尝试下面的方法,但它只返回051-a92,因为我需要05192作为输出。我正在考虑子字符串等,但我现在

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

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,我同意红移的成本很低,但这并不意味着你应该用长文本列来填充它。如果你能将它们解析成更具分析性的形式(数字、类别、日期……),它的可扩展性和成本效益会更高。如果我在其中包含多字节字符呢?哈,这是一个非初学者!如果您真的有多字节字符,那么这些字符可能应该被拆分到上游某个位置。