Russian Qt Forum
Сентябрь 30, 2024, 18:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запросы к PostgreSQL (кто как пишет???)  (Прочитано 8735 раз)
RVZ
Гость
« : Январь 28, 2012, 17:42 »

В общем решил использовать в своих проектах PostgreSQL (раньше юзал MSSQL 2005).
Итак через PgAdminIII нормально отрабатывает....
Код
SQL
SELECT "CurrentVersion", "RegistrationDate" FROM public."CurrentVersion" WHERE "Stat" = TRUE
 
Причем удивляет именно обязательное наличие двойных кавычек при указании имени столбцов.... (может только у меня так???) раньше как то не уделял этому особого внимания ().
А вот из программы запрос в виде
Код
C++ (Qt)
query.exec("SELECT CurrentVersion, RegistrationDate FROM public.CurrentVersion WHERE Stat = TRUE");
 
Работать не хочет... это конечно не особо удивляет. При приведении к следующей форме -
Код
C++ (Qt)
query.exec("SELECT \"CurrentVersion\", \"RegistrationDate\" FROM public.\"CurrentVersion\" WHERE \"Stat\" = TRUE");
 
нормально работает. НО!!!! вот это -
Код
C++ (Qt)
\"...\"....\"
порядком достает.

Хотелось бы узнать кто как оформляет SQL код в своих проектах.... поделитесь опытом.  Непонимающий
Записан
asvil
Гость
« Ответ #1 : Январь 29, 2012, 16:43 »

У вас таблицы созданы с идентификаторами столбцов, имена которых были в кавычках, а значит эти идентификаторы регистрозависимы.
Для сохранения регистра при запросах вам теперь также приходится использовать кавычки.

Предпочтительной нотацией для базы является some_column_identifier.

« Последнее редактирование: Январь 29, 2012, 20:32 от Филоненко Михаил » Записан
Disaron
Гость
« Ответ #2 : Январь 29, 2012, 17:17 »

Дело в том что pgadmin при создании столбцов с разными регистрами в имени - взяли Вы их в кавычки или не взяли, создает их регистрозависимыми, а значит требует взятие в кавычки. Вообще разные регистры в именах столбцов - это паразитство МС-стайл. Отучаться надо от этого с ранних лет.
Записан
RVZ
Гость
« Ответ #3 : Январь 29, 2012, 22:27 »

Огромное спасибо!!!
действительно при исключении заглавных букв надобность в двойных кавычках отпала  Веселый .
Записан
RVZ
Гость
« Ответ #4 : Октябрь 08, 2012, 01:42 »

Всем доброго времени суток.
Продолжаю свое знакомство с PostgreSQL
В общем обрадованный более менее приличной поддержкой функций возвращающих табличные значение в 9.1 дал волю воспаленному мозгу и нарвался на следующие ограничение

Код
SQL
SELECT * FROM me.people AS pe
RIGHT OUTER JOIN (SELECT pe.people_id, mll.doc, mll.stat, mll.prim FROM me.list_people_doc(pe.people_id) AS mll) AS ml
ON pe.people_id = ml.people_id
 
Движок ругается на list_people_doc(pe.people_id) говорит что в этой части я не могу обращаться к pe.people_id хотя очень хочется...

Кто нибудь в курсе с 9.2 тоже не получится? и работал бы подобный код в каких нибудь других движках Непонимающий ?
Записан
cya-st
Гость
« Ответ #5 : Октябрь 08, 2012, 23:50 »

list_people_doc я так понисаю это хранимая процедура, она присутствует в БД? попробуйте задать без me.
Записан
RVZ
Гость
« Ответ #6 : Октябрь 09, 2012, 15:41 »

Если в общем то да.. только list_people_doc это пользовательская функция возвращающая табличное значение (процедур как я понял в PG нет) и да она присутствует и работает (собственно и смысл этого кода заключался в ленивости что бы не писать механизм уже реализованный). без me. не получится это схема а юзверь в public ищет (да и если поставить статическое значение -число например "1" в место pe.people_id то функция запускается).
Как мне кажется проблема гдето с областью видимости пространства pe. (сегодня вечером еще несколько тестов проведу)
Записан
cya-st
Гость
« Ответ #7 : Октябрь 09, 2012, 15:51 »

Цитировать
(процедур как я понял в PG нет)
Функция есть, а процедур нет Смеющийся.
Не хочу вас обидеть, но скорее всего вам нужно изучать с нуля PG
Записан
fte
Гость
« Ответ #8 : Октябрь 09, 2012, 17:11 »

А так?
Код
SQL
SELECT *,(me.list_people_doc(people_id)).* FROM me.people;
Записан
RVZ
Гость
« Ответ #9 : Октябрь 10, 2012, 21:21 »

А так?
Код
SQL
SELECT *,(me.list_people_doc(people_id)).* FROM me.people;

Очень интересный пример. Результат получился как при INNER JOIN а подобный (me.list_people_doc(people_id)).* вызов признаться вижу в первые.
Хотелось бы поподробнее узнать о возможностях такова приема (случайно нет ли ссылки на доку с примерами?)
Есть ли возможность me.list_people_doc(people_id) задать псевдоним (или что то) что бы например поле stat (mll.stat) и pe.stat можно было использовать в WHERE
Записан
fte
Гость
« Ответ #10 : Октябрь 11, 2012, 12:19 »

Ну насчет примеров, обратитесь в специализированные форумы по postgresql..... или , вернее сначала к документации

Код
SQL
SELECT *,(me.list_people_doc(people_id)).* FROM me.people pe WHERE (me.list_people_doc(pe.people_id)).stat = pe.stat;
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.27 секунд. Запросов: 20.