2017-12-13 1 views
0

、私はこのように、ドル金額としてフォーマット値を持っている:BigQueryでこれを整数としてキャストできないのはなぜですか?私のクエリで

Coverage_Amount 
$10,000 
$15,000 
null 
$2,000 

だから私は余分な文字を削除し、0にヌルをマッピング私は戻って、このような列を取得します

Coverage_Amount 
10000 
15000 
0 
2000 

しかし、これらの値は文字列として保存されている、と私はこのような何かしようとすると:

CASE 
    WHEN Coverage_Amount IS NOT NULL THEN INTEGER(REGEXP_REPLACE(query.Coverage_Amount, r'\$|,', '')) 
    ELSE 0 
END AS Coverage_Amount 

を私は

取り戻します
Coverage_Amount 
null 
null 
0 
null 

INTEGER()関数のドキュメントは64ビット整数にexprを

キャストを言います。整数値に対応しない文字列の場合はNULLを返します。

BigQueryが実際に整数であることを認識させるためにできることはありますか?

+0

これは最初以来、編集されています答えは与えられました。私はこれが本当に答えの内容に影響するとは思っていません。私は問題を単純にしていますが、上記は完全な記述です。 –

答えて

1

あなたは、文字列の末尾に0の後にスペースを持っているので、それは可能性があります。

私はf.eを意味します。 '& 10000'。だから、文字列の末尾からすべてのスペースを削除するには(「'、値)RTRIMを使用する

SELECT 
    Coverage_Amount, 
    IFNULL(INTEGER(REGEXP_REPLACE(RTRIM(Coverage_Amount, ' '), r'\$|,', '')),0) AS val 
FROM 
    (SELECT '$10,000 ' Coverage_Amount) 

を試すことができます

その後、出力は次のようになります。

Row Coverage_Amount val 
1  $10,000   10000 
+0

これはまさに問題でした! BQがこの種の変換のためのスペースを扱えないことは、どれほど奇妙なのでしょうか。 –

1

標準を使用していますか?これは、(私がCAST演算子を使用気づく)私の仕事:

WITH data as(
select "$10,000" d UNION ALL 
select "$15,000" UNION ALL 
select "$2,000") 

SELECT 
d, 
CAST(REGEXP_REPLACE(d, r'\$|,', '') AS INT64) AS Coverage_Amount 
FROM data 
+0

これまでに試したことがありますが、 '' 'Unrecognized type INT64'''' –

+0

あなたはレガシーバージョンを実際に使っているようです([標準](https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql) –

+2

また、[alpha UI](https://docs.google.com/forms/d/e/)にサインアップしてください。 1FAIpQLSf6hyfvoWZ8eUbbKWq9fzVfj7ljVyl2SdhtWH038Xrx2eHVrw/viewform)。標準SQLがデフォルトです。 –

1

のBigQuery(respectivellyレガシーSQLおよびStandardSQL)作業用のバージョンを下回ると結果の下に

Coverage_Amount val  
10000   10000  
15000   15000  
2000    2000  

レガシーSQL

を返す両方
#legacySQL 
SELECT 
    Coverage_Amount, 
    IFNULL(INTEGER(REGEXP_REPLACE(Coverage_Amount, r'\$|,', '')), 0) AS val 
FROM 
    (SELECT '10000' Coverage_Amount), 
    (SELECT '15000' Coverage_Amount), 
    (SELECT '2000' Coverage_Amount) 

標準SQL

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT '10000' Coverage_Amount UNION ALL 
    SELECT '15000' UNION ALL 
    SELECT '2000' 
) 
SELECT 
    Coverage_Amount, 
    IFNULL(CAST(REGEXP_REPLACE(Coverage_Amount, r'\$|,', '') AS INT64), 0) AS val 
FROM `project.dataset.table` 

明らかに、「$、15,000」と「$ 10,000個の」と「$、2,000」の同じ作品など

+0

申し訳ありませんが、あなたのレガシーSQLソリューションが私とどのように違うのか分かりません。私はそのようにしても、まだヌルになっています。 –

+0

私たちがあなたを助けることができるようにnullを取得しているCoverage_Amount文字列値を表示します。あなたが提供した例のために - それは標準と旧バージョンの両方のために働きます –

+0

混乱についてごめんなさい –

関連する問題