SQL Server isNumeric() эквивалент в красном смещении амазонки

  • Я использую красное смещение amazon в качестве хранилища данных
  • У меня есть поле (field1) строки типа. Некоторые строки начинаются с четырех цифр и других с буквами:

'test alpha'
'1382 test beta'

  • Я хочу отфильтровать строки, где строка не начинается с четырех чисел
  • Глядя на документацию красного смещения, я не верю, что isnumber или isnumeric являются функциями. Кажется, что "подобная" функция - лучшая возможность.
  • Я пробовал

    где left (field1, 4), например '[0-9] [0-9] [0-9] [0-9]'

это не сработало, и из приведенной ниже ссылки кажется, что красное смещение может не поддерживать это:

https://forums.aws.amazon.com/message.jspa?messageID=439850

есть ли ошибка в предложении 'where'? если нет, и это предложение не поддерживается в redshift, есть ли способ фильтрации? Я думал об использовании

cast(left(field1,4) as integer) 

а затем передайте строку, если она сгенерировала ошибку, но не уверен, как это сделать в красном смещении амазонки. или есть какой-то другой прокси файл для isnumeric фильтра.

спасибо

Ответ 1

Кажется, что redshift не поддерживает одно из следующих действий:

where left(field1,4) like '[0-9][0-9][0-9][0-9]' 
where left(field1,4) ~ '^[0-9]{4}'
where left(field1,4) like '^[0-9]{4}'

что работает:

where left(field1,4) between 0 and 9999

возвращает все строки, начинающиеся с четырех числовых символов.

кажется, что хотя поле1 является строкой типа, функция "между" интерпретирует left (field1,4) как одно целое, когда строковые символы являются числовыми (и не дает ошибки, если они не являются числовыми). Я буду следить, если найду проблему. Например, я не занимаюсь чем-то меньше 1000, поэтому я предполагаю, но не уверен, что 0001 интерпретируется как 1.

Ответ 2

Попробуйте что-то вроде:

where field1 ~ '^[0-9]{4}'

Он будет соответствовать любой строке, которая начинается с 4 цифр.

Ответ 3

Хотя прошло много времени с тех пор, как был задан этот вопрос, я не нашел адекватного ответа. Поэтому я чувствую себя обязанным поделиться своим решением, которое отлично работает на моем кластере Redshift сегодня (март 2016 года).

Функция UDF:

create or replace function isnumeric (aval VARCHAR(20000))
  returns bool
IMMUTABLE 
as $$
    try:
       x = int(aval);
    except:
       return (1==2);
    else:
       return (1==1);
$$ language plpythonu;

Использование:

select isnumeric(mycolumn), * from mytable
    where isnumeric(mycolumn)=false

Ответ 4

похоже на то, что вы ищете, является функцией similar to (Redshift doc)

where left(field,4) similar to [0-9]{4}

Ответ 5

Согласно Amazon, выражения в стиле posix ~ regex работают медленно... https://docs.aws.amazon.com/redshift/latest/dg/pattern-matching-conditions.html

Использование их собственных функций REGEXP_* кажется более быстрым. https://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html

Для проверки только true/false для целых чисел я с успехом использовал следующее. REGEXP_COUNT(my_field_to_check, '^[0-9]+$') > 0

это возвращает 1, если только числовой, 0, если что-нибудь еще

Ответ 6

where regexp_instr(field1,'^[0-9]{4}') = 0

будет удалять строки, начинающиеся с 4 цифр (приведенное выше regexp_instr возвращает 1 для строк с полем 1, начинающимся с 4 цифр)

Ответ 7

Мы пробовали следующее и работали в большинстве наших сценариев:

columnn ~ '^ [-] {0,1} [0-9] {1,} [.] {0,1} [0-9] {0,} $'

Это будет положительный, отрицательный, целочисленный и плавающий числа.

Ответ 8

Красное смещение должно поддерживать аналогично.

WHERE field1 SIMILAR TO '[0-9]{4}%'

Это означает, что поле field1 начинается с 4 символов в диапазоне от 0 до 9, а затем всего остального.