Имена столбцов pqxx в многостоловом запросе

Этот вопрос относится к libpqxx.

Дано выражение SQL, подобное следующему:

string s = "SELECT a.foo, b.bar FROM tableOne a, tableTwo b WHERE a.X=b.X"

и отправив его в транзакцию pqxx:

trans.exec(s.c_str(), s.c_str());

Какие имена будут столбцы в поле результата?

Другими словами, предполагая, что выбрана 1 строка:

pqxx::result::const_iterator row = result.begin();
int foo = row->at(FOO_COLUMN).as<int>();
int bar = row->at(BAR_COLUMN).as<int>();

Какие значения должны иметь FOO_COLUMN и BAR_COLUMN? Будут ли они "a.foo" и "b.bar", соответственно?

Если оператор SQL переименовал переменные с помощью ключевого слова "как", то я полагаю, что имя столбца будет таким, как оно указано в "as", верно?

Обычно я пробовал бы SQL и печатал значения столбцов, но поскольку я занимаюсь разработкой как программного обеспечения, так и самой базы данных, выполнить этот тест сейчас не очень легко.

Спасибо!

1 ответ

Решение

Имена будут foo а также bar, Если они были псевдонимами в запросе, псевдонимы будут возвращены, а исходные имена будут потеряны.

Имена столбцов в результатах никогда не включают имена таблиц.

Если бы они были названы tablename.colnameбыло бы неоднозначно, потому что SELECT 1 as "foo.colname" действителен и создает столбец foo.colname несмотря на то, что нет foo Таблица.

Способ идентификации таблицы, из которой происходит столбец, когда он применяется, заключается в вызове pqxx::result::column_table(column_number) который возвращает oid стола. Имя таблицы не доступно напрямую, но может быть запрошено в pg_class с oid,

Также обратите внимание, что имена столбцов не должны быть уникальными в наборе результатов. SELECT 1 AS a, 2 AS a является допустимым и создает два столбца с одинаковым именем.

Другие вопросы по тегам