为什么BigQuery不能将此数字转换为整数?

时间:2017-12-13 21:44:47

标签: casting google-bigquery

在我的查询中,我有一个格式为美元金额的值,如下所示:

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

所以我删除多余的字符并将null映射到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()功能的文档说

  

将expr转换为64位整数。如果是不与整数值对应的字符串,则返回NULL。

我能做些什么来让BigQuery认识到这些实际上是整数吗?

3 个答案:

答案 0 :(得分:3)

以下两个版本的BigQuery(相应的Legacy 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'等。

答案 1 :(得分: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

答案 2 :(得分:1)

可能是因为你在字符串末尾的0之后有空格。

我的意思是f.e. '& 10000'。所以你可以尝试使用RTRIM(值,'')

angular.forEach($scope.cart, (item) => item.orderNumber = $scope.OrderNumber)

删除字符串末尾的所有空格

然后输出将是:

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