2013-06-05 3 views
7
  • Я использую амазонку красное смещение в моем хранилище данных
  • У меня есть поле (FIELD1) типа строки. Некоторые из строк начинаются с четырьмя цифрами и другими буквами:

«альфа-тест»
«1382 тест бета»IsNumeric в SQL Server() эквивалент в амазонки красного смещения

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

    где слева (field1, 4) как '[0-9] [0-9] [0-9] [0-9]

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

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

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

cast(left(field1,4) as integer) 

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

благодаря

+0

ваш пример не работает на PostgreSQL. ILIKE не поддерживает регулярные выражения. Amazon Redshift основан на PostgreSQL 8.0.2, поэтому, возможно, вы можете использовать SIMILAR-оператор http://www.postgresql.org/docs/8.0/interactive/functions-matching.html#FUNCTIONS-SIMILARTO- REGEXP, потому что, возможно, это ключевое слово SIMILAR. .. некоторые вроде подстроки SELECT ('1234 xxx' FROM 1 FOR 4), аналогичной '[\ d] {4}'; –

ответ

3

кажется, что красное смещение не поддерживает какой-либо из следующих действий:

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.

+1

Я не думаю, что это правильно. Возьмем следующий пример: 'select count (*) from where thing = '3081_xl7' и вещь между 0 и 999999;' Это вернет 1. В этом случае 'thing' является столбцом' varchar'. – bstempi

4

Try что-то вроде:

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

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

+0

спасибо Игорю и Павлу. к сожалению, это не похоже на предыдущие работы с красным смещением. следующее сообщение: – Elm

+0

извините, комментарий был отрезан ... спасибо Игорь и Павел. к сожалению, это не похоже на предыдущие работы с красным смещением. Когда я добавляю предложение 'where field1 ~'^[0-9] {4} '' в оператор, оператор возвращает: «ОШИБКА: Регулярное соответствие выражению не поддерживается [SQL State = XX000]». Если я попробую 'where field1 like'^[0-9] {4} '', он возвращает пустую таблицу, но без ошибки. Если я попробую 'where field1 like' $ '', он вернет все строки. Кажется, redshift поддерживает только «like», но не остальное выражение. Есть идеи? Еще раз спасибо. – Elm

+0

, если вы хотите поближе познакомиться, это ссылка на документы красного смещения относительно «как»: Elm

2

выглядит то, что вы ищете является функция similar to (Redshift doc)

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

Это хорошо работало для меня, за исключением того, что вам нужно использовать апострофы: где слева (поле, 4), похожее на '[0-9] {4}' – najczuk

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

будет удалять строки, начиная с 4-х цифр (выше REGEXP_INSTR возвращает 1 для строк с field1 начиная с 4 цифры)

6

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

Функция ОДС:

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 
+0

, отлично работает! Благодаря :) –

1

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

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

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

Смежные вопросы