Как выбрать столбец (столбцы) по их «числовому» положению в таблице? - PullRequest
2 голосов
/ 01 января 2011

Я пытаюсь выбрать столбцы по их позиции "x" в таблице.

DBI

my $example = $hookup->prepare(qq{SELECT This,That,Condition,"I also want COLUMN-10" FROM tbl LIMIT ? ?});

    ###column_number=10 ordinal_position?? 
    $example->execute('2','10') or die "Did not execute";

Возможно ли это, или мне нужно запустить еще один отдельный выбор, чтобы только этоcolumn?

Одна проблема, с которой я столкнулся, была с столбцом с именем «Condition».По какой-то причине, когда я попытался select Condition, исполнитель умрет.Я никогда не пытался, но, Что, если имя столбца было SELECT?

Еще одно замечание: таблица имеет ширину 75 столбцов, и мне нужно только 50 из них.Имена Col довольно многословны, поэтому я бы хотел назвать их по «позиции».Это также позволило бы изменять имена col в будущем без необходимости изменять оператор select.

Я новичок, поэтому, пожалуйста, объясните любые ответы до моего уровня.Спасибо за любую помощь ..

Ответы [ 2 ]

2 голосов
/ 01 января 2011

Вы почти НИКОГДА не должны полагаться на номер столбца в таблице в любом своем коде (даже если теоретически вы МОЖЕТЕ делать это технически).

Есть много причин, одна из самых важных состоит в том, что кто-то всегда может ИЗМЕНИТЬ таблицу и вставить столбец в начале / середине, полностью нарушая ваш код.

Вторая причина заключается в том, что позиции столбцов - даже если вы предполагаете, что таблица никогда не меняется - создают абсолютно НЕЗАКАЗАННЫЙ и, следовательно, невозможно поддерживать код. Помните ли вы, что столбец 13 был "last_name_3" через 2 года?

Обратите внимание, что если ваша проблема в том, что, например, у вас есть что-то вроде SELECT fn11, fn12, fn13, ... fn32 в вашем коде, и вы чувствуете, что изложение fn11..fn32 - это перетаскивание, вы не только на 100% правы, но вы должны абсолютно Удалите указанное перетаскивание через идиомы Perl следующим образом: "SELECT " . join(", ", map { "fn$_" } (11..32));


Сказав, что, если вы хотите знать, как сделать это ТЕОРЕТИЧЕСКИ, просто как упражнение «крутой технологический трюк», я не знаю хорошего способа сделать это в общем случае через DBI, но вы обычно можете это сделать в зависимости от базы данных.

Для этого следует отметить, что:

  1. Практически ВСЕ базы данных создают таблицы с помощью некоего оператора «CREATE TABLE», который принимает ORDERED список столбцов (большинство реляционных баз данных фактически хранят значения в строке в таком порядке, поэтому это важно - даже если теоретически реляционный исчисление рассматривает столбцы как беспорядочные, как сказал marcog.

  2. Практически ВСЕ да; табазы ​​содержат специальную таблицу, в которой перечисляются, какие таблицы содержат какие столбцы (syscolumns в Sybase, INFORMATION_SCHEMA.COLUMNS в MySQL), и эта таблица содержит числовой идентификатор столбец, который используется для упорядочивания их так же, как порядок «создания»; или даже специальное поле «заказ» (например, ORDINAL_POSITION значение в MySQL).

    Таким образом, вы можете - заблаговременно - запросить упорядоченный список столбцов для нужной таблицы и их порядок. Чтобы запросить MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX". Сохраните данные в списке @columns (или, если у вас много таблиц, хэш массивов,% столбцов, ключом является имя таблицы).

    Затем, при построении запроса, вы просто говорите

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

    Обратите внимание, что фактический SQL, отправляемый на сервер, будет содержать имена столбцов, НО вы не будете жестко кодировать эти имена где-либо в вашем коде.

1 голос
/ 01 января 2011

Вы могли бы прочитать COLUMNS.ORDINAL_POSITION (см. здесь ), но это звучит как катастрофа, ожидающая наступления.

Вы можете (и всегда должны!) Заключать в кавычки имена столбцов в ``, например, SELECT `colname`. Это будет обрабатывать случаи имен таблиц Condition или SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...