5

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

下面的示例有效,与我在 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')
4

3 回答 3

17

您可以使用SAFE_CAST来尝试投射到一个数字。SAFE_CAST转换类似于CAST,但如果转换失败,null则返回而不是 erring。

例如,您可以这样做:

SAFE_CAST('1234567890' AS FLOAT64);

这将返回1.23456789E9

于 2018-08-29T15:41:27.117 回答
3

感谢您的这两个建议,两者都很有用,我选择了 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,'Not a number', 'A number')
 FROM `project.dataset.table`
于 2018-08-31T07:20:10.353 回答
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`
于 2018-08-29T15:39:52.273 回答