«Столбец не найден» при выборе из таблицы в другой схеме - PullRequest
2 голосов
/ 11 ноября 2011

У меня очень странная проблема с H2.

В дополнение ко всем таблицам, находящимся в схеме по умолчанию ("PUBLIC"), у меня есть несколько таблиц, созданных в отдельной схеме (есть веская бизнес-причина сделать это таким образом, но это здесь неактуально). Когда я бегу

select * from schema1.table1

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

select col1, col2 from schema1.table1

запрос не выполнен с ошибкой «Столбец col1 не найден; 42S22 / 42122». Это происходит всякий раз, когда на столбец ссылаются где-либо в select (из предложения / where в положение / etc ...).

Имена столбцов верны и отображаются в INFORMATION_SCHEMA. Кроме того, если я цитирую их, запрос работает должным образом - однако это имеет побочный эффект, заключающийся в том, что имена столбцов чувствительны к регистру, что приводит к сбою в Hibernate, который, очевидно, в любом случае заглавными буквами.

Я пропускаю что-то очевидное здесь? Есть ли причина для этого странного поведения или это ошибка?

Обновление : ответ Томаса заставил меня понять, что проблема была не в другой схеме, а в том, как создавались таблицы в этой схеме; в частности, использование цитируемых идентификаторов. Вот скрипт, который воспроизводит проблему в H2 1.3.161 (последняя версия atm):

create table table1(col1 int, "col2" int);
insert into table1 values(1, 1);
select * from table1; -- works
select col1 from table1; -- works
select "col2" from table1; -- works
select col2 from table1; -- fails

Я не понимаю, почему есть разница между двумя последними запросами. Имя столбца здесь чувствительно к регистру (потому что оно было определено с помощью идентификатора в кавычках), но оно имеет правильный регистр. INFORMATION_SCHEMA. COLUMNS также не показывает различий (кроме имени) между двумя столбцами. Получается ли нечувствительность к регистру для столбцов без кавычек путем принудительного ввода всех запросов в верхнем регистре?

Вышеуказанный скрипт работает должным образом (как и во всех успешных запросах) в Postgres.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Я не могу воспроизвести проблему. Не могли бы вы опубликовать полную, воспроизводимую проблему? Я запустил следующий скрипт в консоли H2, и он работает (т.е. я не получаю исключения):

drop all objects;
create schema schema1;
create table schema1.table1(col1 int, col2 int);
insert into schema1.table1 values(1, 1);
select * from schema1.table1;
select col1, col2 from schema1.table1;
0 голосов
/ 30 августа 2017

У меня была такая же проблема, но в моем случае я неправильно использовал " вместо ' в запросе

...