Соединение AWS redshift с функцией возвращает ошибку

#sql #amazon-web-services #amazon-redshift

Вопрос:

Я пытаюсь объединить две разные таблицы с помощью функции слева — для справки (https://docs.aws.amazon.com/redshift/latest/dg/r_LEFT.html) И это выдает ошибку с надписью «недопустимая операция», я хотел бы, чтобы сообщение об ошибке было немного более полезным. Если я удалю левую функцию, то она будет работать, но мне нужно заставить ее работать с функцией, так как я не видел никаких ограничений в документах.. Я не уверен, почему это не работает с функцией, так как есть какие-либо советы о том, как ее решить?

 select id from state
LEFT JOIN city c ON lower(left(c.segmentation_name::text, '-4'::integer)) = lower(state.name::text)
 

Комментарии:

1. Пожалуйста, предоставьте примеры данных, желаемые результаты и объяснение того, что вы пытаетесь сделать.

2. Просто спрашиваю — зачем кастинг text ? это не тот тип, который обычно используется — он предназначен для устаревшей поддержки таблиц Postgres с узлами-лидерами. Кроме того, странно писать «-4»:: целое число — просто напишите -4. Кроме того, как говорится в ответе, вы передаете здесь положительное значение, а не отрицательное.

Ответ №1:

Если вам нужны все символы, кроме последних четырех, используйте:

 from state s left join
     city c 
     on substring(lower(c.segmentation_name::text), 1, len(c.segmentation_name::text) - 4) = lower(state.name::text)
 

Преобразования text выглядят действительно неловко. Возможно, этого достаточно:

 from state s left join
     city c 
     on substring(lower(c.segmentation_name), 1, len(c.segmentation_name) - 4) = lower(state.name)
 

Комментарии:

1. спасибо, это сработало. Я поддержал ответ.

Ответ №2:

left поддерживает только положительные целые числа в качестве второго аргумента. Попробуй right(c.segmentation_name::text, 4) вместо этого.