W SQL nie ma składni wykluczania kolumn, istnieje tylko składnia włączania kolumn (poprzez operator * dla wszystkich kolumn lub jawne wylistowanie nazw kolumn).
Generuj listę tylko wybranych kolumn
Możesz jednak wygenerować instrukcję SQL z setkami nazw kolumn, bez kilku zduplikowanych kolumn, których nie chcesz, używając tabel schematów i niektórych wbudowanych funkcji bazy danych.
SELECT
'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
SELECT 'demographics' || '.' || column_name
FROM information_schema.columns
WHERE table_name = 'demographics'
AND column_name NOT IN ('zip')
UNION ALL
SELECT 'community' || '.' || column_name
FROM information_schema.columns
WHERE table_name = 'community'
AND column_name NOT IN ('fips')
), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement
To tylko wypisuje instrukcję, nie wykonuje jej. Następnie wystarczy skopiować wynik i uruchomić go.
Jeśli chcesz jednocześnie wygenerować i uruchomić instrukcję dynamicznie, możesz przeczytać, jak uruchomić dynamiczny SQL w Dokumentacja PostgreSQL .
Dołącz nazwy kolumn do nazwy tabeli
Alternatywnie, generuje to listę wyboru wszystkich kolumn, w tym tych ze zduplikowanymi danymi, ale następnie tworzy ich aliasy, aby zawierały również nazwę tabeli każdej kolumny.
SELECT
'SELECT ' || ARRAY_TO_STRING(ARRAY(
SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
FROM information_schema.columns
WHERE table_name in ('sampledata', 'demographics', 'community')
), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement
Ponownie, to tylko generuje oświadczenie. Jeśli chcesz zarówno generować, jak i uruchamiać instrukcję dynamicznie, musisz odświeżyć dynamiczne wykonywanie SQL dla swojej bazy danych, w przeciwnym razie po prostu skopiuj i uruchom wynik.
Jeśli naprawdę potrzebujesz separatora kropek w aliasach kolumn, musisz użyć aliasów z podwójnym cudzysłowem, takich jak SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"'
. Jednak aliasy w podwójnym cudzysłowie mogą powodować dodatkowe komplikacje (rozróżnianie wielkości liter itp.); więc zamiast tego użyłem znaku podkreślenia, aby oddzielić nazwę tabeli od nazwy kolumny w aliasie, a aliasy można wtedy traktować jak zwykłe nazwy kolumn w przeciwnym razie.