Czy istnieje sposób na SELECT
wszystkie kolumny w tabeli oprócz określonych? Byłoby bardzo wygodne, aby wybrać wszystkie nieblobowe lub nie geometryczne kolumny z tabeli.
Coś jak:
SELECT * -the_geom FROM segments;
- Kiedyś słyszałem, że ta funkcja została celowo wyłączona ze standardu SQL, ponieważ zmiana dodawania kolumn do tabeli zmieni wyniki zapytania. Czy to prawda? Czy argument jest prawidłowy?
- Czy istnieje obejście, szczególnie w PostgreSQL?
postgresql
sql-standard
Adam Matan
źródło
źródło
name
,age
,sid
), który pasuje do szerokości ekranu, wynajęliśmy długi binarnegeom
kolumny. Chcę wysłać zapytanie do wszystkich pól oprócz binarnej geometrii, a pisanie ich nazw jeden po drugim jest żmudne.select (!coluns2,!column5) from sometable;
Odpowiedzi:
Taka funkcja nie istnieje ani w Postgres, ani w standardzie SQL (AFAIK). Myślę, że to dość interesujące pytanie, więc trochę googłem i natknąłem się na ciekawy artykuł na postgresonline.com .
Pokazują podejście, które wybiera kolumny bezpośrednio ze schematu:
Możesz stworzyć funkcję, która robi coś takiego. Takie tematy były również omawiane na listach mailingowych, ale ogólny konsensus był prawie taki sam: zapytanie o schemat.
Jestem pewien, że istnieją inne rozwiązania, ale myślę, że wszystkie one będą wymagały jakiegoś magicznego schematu - kwerendowania foo.
BTW: Bądź ostrożny,
SELECT * ...
ponieważ może to skutkować karami za wydajnośćźródło
Prawdziwa odpowiedź jest taka, że po prostu nie możesz. Jest to wymagana funkcja od dziesięcioleci, a programiści odmawiają jej wdrożenia.
Popularna odpowiedź sugerująca zapytania do tabel schematów nie będzie w stanie działać efektywnie, ponieważ optymalizator Postgres uważa funkcje dynamiczne za czarne skrzynki (patrz przypadek testowy poniżej). Oznacza to, że indeksy nie będą używane, a łączenia nie będą wykonywane inteligentnie. Lepiej byłoby z jakimś systemem makr, takim jak m4. Przynajmniej nie dezorientuje optymalizatora (ale nadal może mylić.) Bez samodzielnego pisania kodu i pisania funkcji lub używania interfejsu języka programowania, który utknął.
Poniżej napisałem prosty dowód koncepcji pokazujący, jak słaba byłaby wydajność przy bardzo prostej dynamicznej realizacji w plpgsql. Zauważ też, że poniżej muszę wymusić funkcję zwracającą ogólny rekord do określonego typu wiersza i wyliczyć kolumny. Tak więc ta metoda nie będzie działać dla „zaznacz wszystko oprócz”, chyba że chcesz przerobić tę funkcję dla wszystkich swoich tabel.
Jak widać, wywołanie funkcji skanowało całą tabelę, podczas gdy zapytanie bezpośrednie korzystało z indeksu ( 95,46 ms vs. 00,07 ms ). Tego rodzaju funkcje byłyby źródłem wszelkiego rodzaju skomplikowanych zapytań, które wymagałyby użycia indeksów lub łączenia tabel we właściwej kolejności .
źródło
Jest to całkiem możliwe z PostgreSQL od wersji 9.4, w której wprowadzono JSONB. Zastanawiałem się nad podobnym pytaniem, jak pokazać wszystkie dostępne atrybuty w Mapie Google (przez GeoJSON).
johto na kanale irc sugeruje, aby spróbować usunąć element z JSONB.
Oto pomysł
Podczas gdy zamiast pojedynczych kolumn dostajesz json, właśnie tego chciałem. Być może json może zostać rozwinięty z powrotem do pojedynczych kolumn.
źródło
Jedynym sposobem, w jaki możesz (nie mów, że powinieneś) to zrobić, jest użycie dynamicznych instrukcji SQL. Łatwo (jak napisał DrColossos) przeszukanie widoków systemu, znalezienie struktury tabeli i zbudowanie odpowiednich instrukcji.
PS: Dlaczego chcesz wybrać wszystkie / niektóre kolumny bez znajomości / pisania dokładnie struktury tabeli?
źródło
Dynamicznie, jak wspomniano powyżej, jest jedyną odpowiedzią, ale jej nie polecę. Co się stanie, jeśli dodasz więcej kolumn na dłuższą metę, ale niekoniecznie są one wymagane dla tego zapytania?
Zaczniesz wyciągać więcej kolumn niż potrzebujesz.
Co jeśli zaznaczenie jest częścią wstawki jak w
Wstaw do tabeli A (col1, col2, col3 .. coln) Zaznacz wszystko oprócz 2 kolumn Z tabeliB
Dopasowanie kolumny będzie nieprawidłowe, a wstawianie nie powiedzie się.
Jest to możliwe, ale nadal zalecam pisanie każdej potrzebnej kolumny dla każdej zapisanej selekcji, nawet jeśli prawie każda kolumna jest wymagana.
źródło
SELECT
s.Jeśli Twoim celem jest usunięcie bałaganu z ekranu podczas debugowania, nie wyświetlając kolumn z dużymi wartościami danych, możesz zastosować następującą sztuczkę:
(zainstaluj pakiet contrib „hstore”, jeśli jeszcze go nie masz: „
CREATE EXTENSION hstore;
”)Dla tabeli „test” z col1, col2, col3, możesz ustawić wartość „col2” na null przed wyświetleniem:
Lub ustaw dwie kolumny na null przed wyświetleniem:
zastrzeżeniem jest to, że „test” musi być tabelą (alias lub podselekcja nie będzie działać), ponieważ typ rekordu podawanego do hstore musi być zdefiniowany.
źródło
Jest właśnie obejście, które właśnie odkryłem, ale wymaga wysyłania zapytań SQL z poziomu R. Może to być przydatne dla użytkowników R.
Zasadniczo
dplyr
pakiet wysyła zapytania SQL (a zwłaszcza PostgreSQL) i przyjmuje-(column_name)
argument.Twój przykład można zapisać następująco:
źródło
W komentarzu wyjaśnisz, że Twoim motywem jest wygoda, aby nie wyświetlać zawartości kolumn z długą zawartością, a nie wyświetlać samej kolumny:
Jest to możliwe przy pomocy funkcji pomocnika, która zastępuje długą treść
null
(dowolnątext
kolumną w moim przykładzie, ale zmodyfikowałbyś ją dla typów, które chcesz ukryć):dbfiddle tutaj
źródło
Z perspektywy aplikacji jest to leniwe rozwiązanie. Jest mało prawdopodobne, aby aplikacja automatycznie wiedziała, co zrobić z nowymi kolumnami.
Aplikacje przeglądarki danych mogą wysyłać zapytania do metadanych o dane i wykluczać kolumny z uruchomionych zapytań lub wybierać podzbiór danych kolumny. Nowe obiekty BLOB można wykluczyć po dodaniu. Dane BLOB dla poszczególnych wierszy można wybrać na żądanie.
W każdym wariancie SQL, który obsługuje zapytania dynamiczne, zapytanie można zbudować przy użyciu zapytania na metadanych tabel. Dla waszej intencji wykluczę kolumny oparte na typie, a nie nazwie.
źródło
Nigdy nie widzisz
*
w WIDOKACH SQL ... sprawdź\d any_view
u siebiepsql
. Istnieje (introspektywne) przetwarzanie wstępne dla wewnętrznej reprezentacji.Wszystko wskazuje, że dyskusja tutaj propozycja problem (implicite w pytaniu i dyskusji) to cukier składni dla programistów, a nie prawdziwe „Optymalizacja SQL problem” ... Cóż, zgaduję, że jest 80% programistów.
Można go więc wdrożyć jako „ wstępną analizę z introspekcją” ... Zobacz, co robi PostgreSQL, gdy deklarujesz SQL-VIEW za pomocą
SELECT *
: konstruktor VIEW przekształca*
się w listę wszystkich kolumn (przez introspekcję i w momencie uruchomienia UTWÓRZ WIDOK kod źródłowy).Wdrożenie dla CREATE VIEW i PREPARE
To realne wdrożenie. Załóżmy, że tabela
t
z polami(id serial, name text, the_geom geom)
.To samo dotyczy instrukcji PREPARE .
... więc jest to możliwe i właśnie tego potrzebuje 80% programistów, cukru składniowego dla PREPARE i WIDOKÓW!
UWAGA: oczywiście opłacalna składnia może nie jest
- column_name
, jeśli istnieje pewien konflikt w PostgreSQL, więc możemy zasugerowaćEXCEPT column_name
,EXCEPT (column_name1, column_name2, ..., column_nameN)
lub inny.źródło
To jest moja funkcja, aby wybrać wszystkie oczekiwane kolumny. Połączyłem pomysły z postgresonline.com i postgresql tuturial i z innych źródeł.
źródło