是否有BigQuery版本的数字

时间:2018-08-29 14:57:36

标签: google-bigquery

我需要使用BigQuery中的标准SQL测试字段是否为数字。

下面的示例可以正常工作,类似于我在IBM Cognos中使用TRANSLATE('mystring','1234567890。','')所做的操作,但它并不十分优雅。

SELECT
IF(LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('1234.56','1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9',''),'0',''),'.',''))=0,
'A number',
'Not a number')

3 个答案:

答案 0 :(得分:5)

您可以使用SAFE_CAST尝试强制转换为数字。 SAFE_CAST的转换与CAST类似,但是如果转换失败,则返回错误的null

例如,您可以这样做:

SAFE_CAST('1234567890' AS FLOAT64);

这将返回1.23456789E9

答案 1 :(得分:1)

  

但不是很优雅

下面是BigQuery标准SQL的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '1234.56' col UNION ALL
  SELECT '1234.' col UNION ALL
  SELECT '1234' col UNION ALL
  SELECT '.56' col UNION ALL
  SELECT '1234..56' col UNION ALL
  SELECT 'a1234.56' 
)
SELECT
  col,
  IF(LENGTH(REGEXP_REPLACE(col, r'[\d.]', '')) = 0, 'A number', 'Not a number') ,
  IF(REGEXP_CONTAINS(col, r'^\d*.?\d*$'), 'A number', 'Not a number') 
FROM `project.dataset.table`

答案 2 :(得分:0)

感谢这两个建议,都可以使用,我已经选择SAFE_CAST选项,因为它运行速度更快。

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '1234.56' col UNION ALL
  SELECT '1234.' col UNION ALL
  SELECT '1234' col UNION ALL
  SELECT '.56' col UNION ALL
  SELECT '1234..56' col UNION ALL
  SELECT 'a1234.56' 
 )
 SELECT
   col,
   if(SAFE_CAST(col AS FLOAT64) is null,'Note a number', 'A number')
 FROM `project.dataset.table`