Ошибка «не удалось найти функцию преобразования из неизвестного в текст» в SQL-запрос - PullRequest
0 голосов
/ 06 июня 2018

Мне нужно написать запрос, на который, если я передам некоторый список строк, он проверит в конкретной таблице, есть ли те, которые есть, и вернут, которые отсутствуют.Я написал следующий запрос для этого

SELECT temp_table.configuration_key FROM (#PLACEHOLDER) temp_table 
LEFT JOIN configuration c ON (c.configuration_key = temp_table.configuration_key) WHERE c.configuration_key IS NULL;

, где #PLACEHOLDER будет формироваться динамически, как после

1.если передана одна строка, #PLACEHOLDER будет

SELECT 'xyz' configuration_key

, если передано более одной строки, #PLACEHOLDER будет

SELECT 'xyz' configuration_key UNION ALL SELECT 'abc'

и т. д.

Здесь 2-йзапрос работает нормально, но выдает следующую ошибку 1-му запросу

failed to find conversion function from unknown to text 

таблица конфигурации содержит один столбец с именем configuration_key

Может кто-нибудь сказать мне, что здесь не так.как сформировать запрос, если передана только одна строка (т.е. сформировать таблицу с одним элементом).Я знаю, что могу сделать это совершенно другим запросом.Но я не могу сделать это, используя тот же тип запроса?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я столкнулся с подобной ошибкой, пытаясь выполнить in-DB_Write только одной записи в базе данных (не удалось найти функцию преобразования из неизвестного в символьную).Мой инструмент in-DB_Write получает свои данные непосредственно из инструмента in-DB_Connect с пользовательским запросом.Я использую драйвер загрузки Redshift Bulk для своих записей (я не вижу способа настроить конкретный инструмент in-DB_Write для использования обычного драйвера).Драйвер массовой загрузки использует команду COPY для загрузки с S3.

После прочтения вашего поста я подозревал, что инструмент in-DB_Write предполагает, что первая строка является строкой заголовка, а фактические данные начинаются со 2-й строки,Так что я сделал объединение точно такого же SQL в моем in-DB_Connect, и это сработало.

В итоге, это не удалось:

Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control

Но это работает:

Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control
union
Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control

Наконец, вы заметите, что я не использую объединение ALL, поэтому вышеприведенный запрос по существу возвращает только одну строку .... но каким-то образом это работает.Это не идеальное решение, но обходит ошибку.

0 голосов
/ 06 июня 2018

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

SELECT temp_table.configuration_key 
FROM (SELECT 'xyz'::text configuration_key
) temp_table 
LEFT JOIN configuration c ON (c.configuration_key = temp_table.configuration_key) 
WHERE c.configuration_key IS NULL;

SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...