Есть ли BigQuery версия isnumeric - PullRequest
       5

Есть ли BigQuery версия isnumeric

0 голосов
/ 29 августа 2018

Мне нужно проверить, является ли поле числовым или не использует стандартный SQL в BigQuery.

Пример ниже работает и похож на то, что я сделал в 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 голосов
/ 29 августа 2018

Вы можете использовать SAFE_CAST, чтобы попробовать приведение к числу. SAFE_CAST приведение типов похоже на CAST, но если произойдет сбой приведения, вместо ошибки возвращается null.

Например, вы можете сделать:

SAFE_CAST('1234567890' AS FLOAT64);

, который вернет 1.23456789E9

0 голосов
/ 31 августа 2018

Спасибо за оба предложения, оба работают хорошо, и я выбрал опцию 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`
0 голосов
/ 29 августа 2018

но это не очень элегантно

Ниже приведены примеры для BigQuery Standard 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...