Hogyan sorolhatom fel az összes oszlopot egy megadott táblához?

Pontos információt keresek egy adatbázisban, amelyről nincs tudomásom.

Ez egy harmadik féltől származó termék, lassan válaszolnak néhány kérdésre, és tudom, hogy az adatok abban a db-ben rejlenek, ezért szeretnék egy kicsit retrotechnikával foglalkozni.

Adva egy tábla, lehet-e listát az oszlopok nevéről ehhez a táblához?

Például az SqlServerben lehetséges egy táblát egy újrafelhasználható utasítások, amelyek szövegesen felsorolják az összes oszlopot, amelyekből a táblázat áll. a DB?

  • @dezso, külön gépen van, de tudok belépni, és elindítani a psql parancssort rendszergazdai jogokkal
  • Ha jól értem, akkor \dt[+] table_name után vannak a psql -ban.
  • sebesség. \ dt + didn nem tűnik egyértelműen az oszlopok nevének megjelenítése. csak egy " Leírás " mezőt ad hozzá.
  • de a \ d + táblanév működik!
  • Válasz

    A már megtalált \d+ <table_name> parancssoron kívül használja az információs sémát az oszlopadatok megkereséséhez a information_schema.columns :

    SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ; 

    Megjegyzés: A fenti példa szerint ellenőrizze, hogy az értékek idézőjelek közé vannak-e foglalva.

    Megjegyzések

    • A psql-ben használja a \x on vagy \pset expanded on parancsot a lekérdezés elkészítéséhez eredmények lineárisak (táblázatos helyett), és így könnyebben olvashatók stackoverflow.com/a/9605093/513397
    • A jelenlegi verziókban (kipróbálta) a 9.6-ban) a psql \d+ public.* fájlban megteheti az összes tábla és nézet leírását (séma + indekciók / fkeys / triggerek) a public séma. Az előzetes elkötelezettségű szkriptünkben nyomon követjük az egyes elkötelezettek által végrehajtott változtatásokat a DB-ben.
    • SELECT oszlopnév csak oszlopnév megszerzéséhez

    Válasz

    A többi válasz kiegészítéseként még egy sor sem visszatérő SELECT utasítás is kiteszi az oszlopneveket Önnek és az alkalmazás kódjának.

    select * from table_name where false; 

    Az engedélyek ezeknek a megközelítéseknek bármelyikével játszhatók lehetnek.

    Megjegyzések

    • Feltételezem, hogy ezt az SQL-t akarod átadni a psql parancsnak. Azt javaslom, hogy ebben az esetben használja a –no-psqlrc opciót, hogy elkerülje a meglepetéseket a kimenetben.
    • Kivéve a rejtett oszlopokat, amelyeket meg kellett adni a kiválasztáshoz (például pg_class.oid)

    Válasz

    A információséma a lassú és biztos út: szabványosított és nagyrészt hordozható más, ezt támogató adatbázisokban. És továbbra is működik a főbb verziók között.

    Azonban az információsémában az nézetek gyakran csatlakoznak a rendszerkatalógusok számos táblája szigorúan megfelel szabványosított formátum – amelyek közül sok a legtöbb esetben csak halott teherfuvar. Ez lassúvá teszi őket .
    A Postgres fejlesztői nem ígérgetéseket tesznek, hanem alapokat (például itt szükségeseket) A fő verziók nem változnak.

    psql (a natív parancssori felület) természetesen a gyors sávot választja, és közvetlenül lekérdezi a forrást . Ha a psql elemet a -E paraméterrel indítja, akkor az SQL mögött olyan backslash parancsok jelennek meg, mint a \d. Vagy \set ECHO_HIDDEN on a psql parancssorból. Innentől kezdve felépítheti a választ a kérdésére.

    Adhat egy táblázatot az oszlopok nevének listájához ehhez táblázat.

    SELECT attrelid::regclass AS tbl , attname AS col , atttypid::regtype AS datatype -- more attributes? FROM pg_attribute WHERE attrelid = "myschema.mytable"::regclass -- table name, optionally schema-qualified AND attnum > 0 AND NOT attisdropped ORDER BY attnum; 

    Gyorsabb, mint lekérdezés information_schema.columns . Próbálkozzon a EXPLAIN ANALYZE vel, hogy megbizonyosodjon róla. Még mindig alig számít az egyszeri kereséshez. De változhat, ha egy olyan lekérdezésben / függvényben használják, amelyet sokszor ismételnek.

    A láthatóságban vannak finom különbségek is. Részletes összehasonlítás:

    Megjegyzések

    • Nagyon tetszik, hogy megmutatja -E, és megmutatja az embereknek, hogyan lehet megszerezni a psql sql-jét.
    • Egyetértek.Futtattam néhány sebességtesztet, és a pg_catalog több mint kétszer olyan gyorsan fut

    Answer

    psql a PostgreSQL 11+ rendszeren

    Ha oszloptípusokat keres egy lekérdezésnél, használhatja a psql “s \gdesc

    SELECT NULL AS zero, 1 AS one, 2.0 AS two, "three" AS three, $1 AS four, sin($2) as five, "foo"::varchar(4) as six, CURRENT_DATE AS now \gdesc Column | Type --------+---------------------- zero | text one | integer two | numeric three | text four | text five | double precision six | character varying(4) now | date (8 rows) 

    Válasz

    csak a PostgreSQL

    Ez kissé hokey, de versenyző lehet, ha a lehető legrövidebb SQL-t keresed:

    SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON))) 

    vagy még rövidebb (feltételezve, hogy a táblázatban legalább egy sor van)

    SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1))) 

    A lista fenntartja a sorrendet. Abban az esetben, ha nem érdekel a megrendelés, és telepítve van a hstore kiterjesztés, akkor még rövidebbet tehet

    SELECT skeys(hstore(NULL::schema_name.table_name)) 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük