Имена столбцов 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
является допустимым и создает два столбца с одинаковым именем.