2011-01-01 2 views
1

Я пытаюсь выбрать столбцы по их «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"; 

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

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

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

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

+0

PS смещение строки 2 10 не имеет отношения, просто для тестирования .. – DulcimerDude

ответ

1

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

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

+2

Спасибо. Ваш ответ был полезен. Указание на использование цитат зафиксировано в одной из моих проблем. Первое, что я узнал в этом году !!! – DulcimerDude

+0

@marcog - это НЕ ПОЛНОСТЬЮ правильно. Столбцы определяют позиции в конкретных реализациях сервера баз данных (возможно, ВСЕ из них), даже если эта позиция не является частью теоретического реляционного исчисления, лежащего в основе упомянутых реализаций. В большинстве случаев каждый сервер базы данных создает таблицы с инструкцией, последовательно перечисляющей столбцы, и большую часть хранит эту информацию таблицы в специальной таблице таблиц «таблицы», которая имеет упорядоченный числовой идентификатор для каждого столбца в правильном порядке. – DVK

+0

@marcog - это, конечно же, не отвлекает от факта, что вы почти никогда не полагаетесь на номер столбца в таблице в любом из вашего кода (если не по какой-либо другой причине, чем кто-то всегда может ALTER table и вставить столбец в начало/среднее) – DVK

2

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

Есть много причин, один из самых важных заключается в том, что кто-то всегда может ALTER table и вставлять столбец в начале/середине, полностью разбивая ваш код.

Вторая причина заключается в том, что позиции столбцов - даже если вы предполагаете, что таблица никогда не изменяется - делают абсолютно НЕСОСТОЯТНЫМ и, следовательно, невозможно поддерживать код. Помните ли вы, что столбец 13 был «last_name_3» через 2 года?

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


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

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

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

  2. Практически все да; tabases содержат специальную таблицу, в которой перечислены таблицы, которые содержат столбцы (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 отправляется на сервер будет содержать имена столбцов, но вы не трудно-коду этих имен в любом месте в вашем коде.

+0

Обратите внимание, что этот ответ относится только к базам данных RELATIONAL. Вполне возможно, что маловероятно, что некоторые/все нереляционные БД на самом деле не имеют определенного или доступного порядка столбцов, поскольку я сказал, что он зависит от сервера БД. – DVK

Смежные вопросы