Создать Python UDF в Redshift, чтобы заменить символ из строки - PullRequest
1 голос
/ 15 мая 2019

В моей БД есть столбец varchar. Он должен иметь такие значения, как «43», «43000», «50000» и т. Д., Но иногда он может иметь значения, такие как «43, 000», «50, 00,000» и т. Д., А также иногда иметь значения мусора с другими символами.

То, что я хочу сделать, сначала замените все ',' из значений, затем попытайтесь преобразовать его в int, в случае успеха верните это значение int. В противном случае верните null. Я пытаюсь написать для него Python UDF, но, похоже, это не работает. Вот оно:

create or replace function isnumeric (aval VARCHAR(20000))
  returns int
IMMUTABLE 
as $$
    try:
       aval = aval.replace(',','');
       x = int(aval);
       return x;
    except:
       return (1==2);
       return null;

$$ language plpythonu;

select 

isnumeric(field1) 

from 
table
limit 10000

Может кто-нибудь помочь мне, пожалуйста ??

1 Ответ

2 голосов
/ 15 мая 2019

На мой взгляд, вам не нужен UDF. Вы можете использовать REGEXP_INSTR для поиска недопустимых значений, а затем использовать REGEXP_REPLACE для очистки нецифровых символов от допустимых строк.

WITH test_vals AS 
    (          SELECT 'garbage_1' test,   'xx43,000' val 
     UNION ALL SELECT 'decimal'   test,  '43,000.00' val 
     UNION ALL SELECT 'commas'    test,  '50,00,000' val 
     UNION ALL SELECT 'date_val'  test, '2019/03/03' val 
)
SELECT test
       --Any character other than numbers, commas or decimal returns NULL
     , CASE WHEN REGEXP_INSTR(val,'[^0-9,.]') > 0 THEN NULL 
       --Commas are removed, decimal marker is retained
       ELSE REGEXP_REPLACE(val,'[^0-9.]','') END::NUMERIC  AS ouput 
FROM test_vals
;

Вывод:

   test    |  ouput
-----------+---------
 garbage_1 |
 decimal   |   43000
 commas    | 5000000
 date_val  |
...