Я пытаюсь запросить строку следующим образом:Проблема Oracle с использованием concat || оператор
В настоящее время моя таблица Oracle имеет около 60 столбцов. Таким образом, чтобы запросить строку для против всех столбцов будет выглядеть следующим образом,
Работа запроса:
select * from <table_name> where (col1||col2||col3...||col60) like '%string%'
Не работает запрос:
я добавил еще один запрос, чтобы получить все столбцы динамически, как указано ниже,
select * from <table_name> where (select LISTAGG(COLUMN_NAME, '||') WITHIN GROUP (ORDER BY COLUMN_NAME) from all_tab_columns where TABLE_NAME = '<table_name>' and OWNER = '<owner_name>' and DATA_TYPE != 'CLOB') like '%string%'
дополнительный запрос :
Нет проблем с нижеследующим подзапросом.
select LISTAGG(COLUMN_NAME, '||') WITHIN GROUP (ORDER BY COLUMN_NAME) from all_tab_columns where TABLE_NAME = '<table_name>' and OWNER = '<owner_name>' and DATA_TYPE != 'CLOB'
Где подзапрос возвращает результат, как в рабочем запросе.
Я думаю, что оракул, берущий "||" оператор concat только тогда, когда он жестко кодирует его.
Не могли бы вы помочь мне в этом?
Это никогда не называется оператором «труба» в SQL. Это только в сценарии оболочки unix. – Hogan
Вы должны использовать *** динамический SQL *** для достижения желаемого результата. Col1 || col2 в вашем первом запросе принимает значения VALUES в столбцах и объединяет их. Второй запрос объединяет имена COLUMN, а не значения, для сравнения с% string%. Таким образом, ваш второй запрос в основном возвращает строку «Col1 || Col2 || Col3 ...» и сравнивает ее с% string%. Это значительно отличается от первого запроса. Для достижения того, что, по вашему мнению, вам нужно, вам нужно сделать второй запрос строкой, конкатенирующей результаты вспомогательного запроса, а затем «выполнить (str)»; – xQbert
Обратите внимание, что ваш «рабочий» запрос, вероятно, получает несоответствие, если 'Col2' заканчивается' st' и 'Col3' запускает' ring'. Вам придется решить, является ли это проблемой или нет. –