2017-11-28 5 views
0

私はこの赤方偏移SQLクエリを持っています。私は "REGEXP_SUBSTR"関数を使ってコメントから10進数の数字を抽出しました。私もそれを文字列から数値/小数に変換する必要があります。それから、その数を合計から引く必要があります。文字列を10進数のレッドシフトに変換するSQL

私は赤方偏移SQLの「TO_NUMBER」機能を使用してみましたが、そのは私に次のことを与えてこれは私のクエリ

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 

です:ERROR:タイプの数値のための無効な入力構文:「」

この電流出力はコメント欄から数還付量を抽出前に、次のとおりです。

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 : [email protected] 
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 

これはusin後にそれでありますg REGEXPで上記のSQLクエリを実行します。私はまだいくつかの異常があります。私は別の数値で減算を行うために、私は数値に私の文字列の正規表現に変換するにはどうすればよい

  • 上で見た異常を考慮するREGEXPを編集するにはどうすればよい

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

    二つの質問

    1. カラム?

    ご協力いただければ幸いです。ここで

  • +0

    すべての行に対してRegexを使用して文字列から数値を抽出できますか?特定の行の変換エラーに遭遇している可能性があります.1つまたは複数の行は、数値に変換するのに望ましい形式ではない可能性があります。 – Yankee

    +0

    はい、正しいですが、Regexを使用した後にいくつかの空の行があります。コメント欄に払い戻しが記録され、コメントの中には数字が入力されていないものがあります。 –

    +0

    コメント欄には数字の払い戻し金額が表示され、数字の隣に「$」記号があり、その他には小数点以下の(人為的な)誤差があります。その約20%のデータがそうです... –

    答えて

    0

    は方法です - あなたは、文字列が数値であり、そのためにあなたが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 
    
    +0

    あなたの意見をお寄せいただきありがとうございます。私はRJMetrics - Magento BI Softwareにいて、DBに直接アクセスして機能を作成していないと言いました。 –

    +0

    あなたはadhocのSQL​​を実行することはできません? –

    +0

    私は間違いないかもしれませんが、新しい機能を作成することはできません –

    0

    私のアプローチは、最初に2つの列を追加することです.1つは文字列の長さ、もう1つはカウント可能な文字です。この表から、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 
    
    関連する問題