sql >> Databáze >  >> RDS >> Mysql

Jak mohu vybrat sloupce podle jejich číselné pozice v tabulce?

Téměř NIKDY byste neměli spoléhat na číslo sloupce v tabulce v žádném z vašich kódů (i když to technicky technicky MŮŽETE).

Důvodů je mnoho, jedním z nejdůležitějších je, že někdo může tabulku vždy ZMĚNIT a vložit sloupec na začátek/uprostřed, čímž váš kód úplně rozbije.

Druhým důvodem je, že pozice sloupců – i když předpokládáte, že se tabulka nikdy nemění – jsou absolutně NEČITELNÉ, a proto je nemožné udržovat kód. Pamatujete si, že za 2 roky byl sloupec 13 „last_name_3“?

Vezměte prosím na vědomí, že pokud je váš problém například v tom, že máte něco jako SELECT fn11, fn12, fn13, ... fn32 ve vašem kódu a máte pocit, že byste chtěli napsat fn11..fn32 je přetažení, nejenže máte 100% pravdu, ale měli byste toto přetažení absolutně odstranit pomocí perlských idiomů, a to následovně:"SELECT " . join(", ", map { "fn$_" } (11..32));

Když už jsem řekl, že pokud chcete vědět, jak to udělat TEORETICKY, jen jako cvičení "cool technologický trik", neznám dobrý způsob, jak to udělat obecně přes DBI, ale obvykle to můžete udělat v databázi- konkrétním způsobem.

Chcete-li tak učinit, měli byste si uvědomit, že:

  1. Téměř VŠECHNY databáze vytvářejí tabulky pomocí nějakého příkazu "CREATE TABLE", který přebírá ORDERED seznam sloupců (většina relačních databází ve skutečnosti fyzicky ukládá hodnoty do řádku v tomto pořadí, takže je to důležité - i když teoretický relační kalkul považuje sloupce za pořadí- méně, jak řekl Marcog).

  2. Téměř VŠECHNY databáze obsahují speciální tabulku, která uvádí, které tabulky obsahují jaké sloupce (syscolumns v Sybase, INFORMATION_SCHEMA.COLUMNS v MySQL) a tato tabulka obsahuje číselné ID sloupce, které se používá k jejich řazení stejně jako k pořadí „vytvoření“; nebo dokonce speciální pole "objednávka" (např. ORDINAL_POSITION hodnotu v MySQL).

    Takže můžete - předem - dotazovat se na seřazený seznam sloupců pro požadovanou tabulku a jejich pořadí. Pro dotaz na MySQL SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Uložte data do seznamu @columns (nebo pokud máte mnoho tabulek, hash polí, %sloupců, přičemž klíčem je název tabulky).

    Poté při vytváření dotazu jednoduše řeknete

    "select $columns{table1}->[11],$columns{table1}->[13], ...."

    Upozorňujeme, že skutečné SQL odeslané na server bude obsahovat názvy sloupců, ALE tyto názvy nikde ve svém kódu pevně nezakódujete.



  1. MySql Count nemůže zobrazit 0 hodnot

  2. Jak vygenerovat dynamickou sekvenční tabulku v MySQL?

  3. Vzájemní přátelé sql s připojením (Mysql)

  4. 3 způsoby, jak najít řádky, které obsahují malá písmena v MySQL