Довідка - по - sql (dml) як виводити в запиті всі стовпці крім одного, не відраховуючи їх

Іншими словами, як виключити стовпець з відомим ім'ям з результату запиту select * from Table?

Перераховувати стовпці також доводиться в операторі INSERT, виключаючи зі списку автоінкрементіруемие стовпці або стовпці, яким потрібно присвоїти значення за замовчуванням.

Припустимо, потрібно вибрати всі стовпці з таблиці Laptop крім стовпця code. Щоб вивести всі стовпці таблиці, досить написати

Але щоб виключити зі списку стовпець code. ми змушені перерахувати всі інші стовпці:

Було б непогано, якщо ми могли написати щось типу

Подібна можливість дозволила б нам уникнути рутинної роботи з ймовірністю помилитися при наборі і стала в нагоді б при динамічному формуванні запиту, коли заздалегідь не відома ні таблиця, ні число стовпців в ній.

Але, на жаль, такої можливості у нас немає. Зате ми можемо сформувати список стовпців за допомогою допоміжного скрипта, щоб в подальшому використовувати його результати в запитах. Це ми можемо зробити, використовуючи стандартний вигляд метаданих, яке називається інформаційною схемою:

Предикат NOT IN ми використовуємо для того, щоб можна було в перспективі виключати не один, а декілька стовпців. Тепер нам потрібно отримати результат у вигляді рядка символів, що представляє собою розділений комами перелік стовпців. Для цього нам уже доведеться використовувати нестандартні засоби.

SQL Server

Зокрема, для SQL Server ми можемо це зробити за допомогою конструкції FOR XML PATH. замінивши попутно за допомогою функції REPLACE пробіл між іменами стовпців на коми:

В принципі, ми в змозі сформувати необхідний оператор цілком з тим, щоб його можна було динамічно використовувати в коді програми:

У разі MySQL ми можемо скористатися спеціальною агрегатної функцією GROUP_CONCAT:

Слід зазначити, що в MySQL інформаційна схема відноситься не до окремої базі даних, а до всього сервера. Тому на той випадок, якщо в різних базах сервера є таблиці з однаковими іменами, в умови відбору потрібно додати предикат із зазначенням схеми (бази даних): TABLE_SCHEMA = 'computers'.

Конкатенація в MySQL виконується за допомогою функції CONCAT. В результаті остаточне рішення нашої задачі можна написати так:

PostgreSQL

У PostgreSQL завдання представлення значень стовпця у вигляді текстового списку можна вирішити за допомогою двох вбудованих функцій: ARRAY і ARRAY_TO_STRING. Перша з них перетворює вибірку в масив значень, а друга перетворює масив в список. При цьому другим параметром функції ARRAY_TO_STRING задається символ, який буде роздільником елементів списку. Тепер рішення нашої задачі можна записати у вигляді:

Зауважимо, що для конкатенації рядків в PostgreSQL використовується стандартний оператор "||", і відзначимо необхідність явного приведення типу даних стовпця COLUMN_NAME (information_schema.sql_identifier) ​​до типу CHAR / VARCHAR.


Тріщина на лобовому склі Mitsubishi carisma www.remont-skolov.nethouse.ru
remont-skolov.nethouse.ru