【问题标题】:Converting String to Decimal Redshift SQL将字符串转换为十进制 Redshift SQL
【发布时间】:2017-11-28 08:04:22
【问题描述】:

我有这个红移 SQL 查询。我使用“REGEXP_SUBSTR”函数从评论中提取了一个带小数的数字。我还需要将它从字符串转换为数字/十进制。然后,我需要从总数中减去这个数字。

这是我的查询

SELECT sc.comment, 
       sm.subtotal, 
       to_number(REGEXP_SUBSTR(sc.comment, '[0.00-9]+..[0.00-9]+', 1),'9999999D99')

FROM "sales_memo_comments" sc INNER JOIN "sales_memo" sm ON sc.foreign_id = sm.parent_id

我尝试在 Redshift SQL 上使用“to_number”函数,但它给了我以下信息:错误:数字类型的输入语法无效:“”

这是当前输出之前从评论栏中提取号码退款金额:

comment
"SAR719.00 Refund transaction executed successfully, Refund Request ID:504081288877953603 \n    , Authorization Code:095542 "
"AUD52.07 Refund transaction executed successfully, Refund Request ID:6J45695858A90833"
Canceled by : ron.johnd@company.co.us
refund amount is [MYR197.41]
"Please Ignore Order refunded by Refund Request ID:5002758809696048 , Authorization Code:2587759"
OMR37.83($98.23) Refund transaction executed successfully

这是在使用上述带有 REGEXP 的 SQL 查询之后的结果。我仍然遇到一些异常情况。

comment
719
52.07
.co.
197.41
5.0027621
37.83($98.23

两个问题

  1. 如何编辑 REGEXP 以考虑上述异常情况
  2. 如何将字符串 REGEXP 转换为数值以与另一个数值列相减?

任何帮助将不胜感激。

【问题讨论】:

  • 您确定可以使用正则表达式从字符串中提取所有行的数字吗?似乎您可能会遇到特定行或行的转换错误,这可能不是转换为数字的所需形式。
  • 是的,你是对的,使用正则表达式后有一些空行。评论栏是记录退款的地方,有些cmet没有输入号码。
  • 评论部分的退款金额旁边有“$”符号,其他有超过小数的数字(人为错误)......大约有 20% 的数据是这样的...... .
  • 这意味着您必须对正则表达式进行更改以适应这些行。
  • 感谢您的提示。你说的对。您有什么想法可以容纳我不想带任何“$”“()”符号或没有可用数字的行吗?

标签: amazon-redshift aws-redshift


【解决方案1】:

这是一种方法 - 您需要能够测试字符串是否为数字,为此您需要一个 UDF - 所以只需运行一次即可定义该函数

create or replace function isnumeric (aval VARCHAR(20000))
  returns bool
IMMUTABLE
as $$
    try:
       x = int(aval);
    except:
       return (1==2);
    else:
       return (1==1);
$$ language plpythonu;

然后,您可以按如下方式更改代码

SELECT sc.comment, 
       sm.subtotal, 
       to_number(
case when isnumeric(REGEXP_SUBSTR(sc.comment, '[0.00-9]+..[0.00-9]+', 1))
then REGEXP_SUBSTR(sc.comment, '[0.00-9]+..[0.00-9]+', 1)
else 0 end
,'9999999D99')

FROM "sales_memo_comments" sc INNER JOIN "sales_memo" sm ON sc.foriegn_id = sm.parent_id

【讨论】:

  • 嘿,感谢您分享您的意见。我忘了提到我在使用 RJMetrics - Magento BI 软件,并且无法直接访问数据库来创建函数。
  • 所以你不能运行 adhoc sql?
  • 我肯定可以,但不能创建新功能
  • 要么让某人授予您访问权限,要么让他们运行该 sql,以便您可以使用该功能。 docs.aws.amazon.com/redshift/latest/dg/…
  • 数据库管理员在梦中告诉我
【解决方案2】:

我的方法是首先添加两列:一列用于字符串长度,另一列用于计算允许的字符。从此表中,您可以仅过滤两个匹配的行(即没有不允许的字符),然后将剩余的值转换为浮点数或小数或其他值。

with temp as (
SELECT '719' as comment
UNION SELECT '52.07'
UNION SELECT '.co.'
UNION SELECT '197.41'
UNION SELECT '5.0027621'
UNION SELECT '37.83($98.23'
),
temp2 as (
  SELECT *
    ,regexp_count(comment, '[0-9.]') as good_char_length
    ,len(comment) as str_length
  FROM
    temp
)

SELECT *
  ,comment::float as comment_as_float
FROM
  temp2
WHERE
  good_char_length = str_length

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2013-02-07
    • 2010-09-18
    相关资源
    最近更新 更多