2010-11-02 2 views
14

Я знаю, чтоSQL Список всех имен столбцов в алфавитном порядке

SELECT * FROM Table 

перечислит все столбцы в таблице, но я заинтересован в перечисляя столбцы в алфавитном порядке.

Скажите, у меня есть три столбца, «имя», «возраст» и «секс».

Я хочу, чтобы столбцы организованы в формате

|age| |name| |sex| 

Можно ли сделать это с помощью SQL?

ответ

12

Да, и нет :-)

сам SQL не все равно, что заказать колонны выходят в России, но, если бы вы использовали:

select age, name, sex from ... 

вы обнаружите, что они, вероятно, вышло в этом порядке (хотя я не уверен, что стандарты SQL соответствуют этому).

Теперь вы можете не хотите сделать это, но иногда жизнь не справедлива :-)

У вас также есть другая возможность использования таблиц определения данных СУБД для динамического создания запроса. Это не переносится, но большинство СУБД поставляют эту таблицу (например,), и вы можете выбрать имена столбцов оттуда упорядоченным образом. Что-то вроде:

select column_name from sysibm.syscolumns 
where owner = 'pax' and table_name = 'movies' 
order by column_name; 

Затем вы используете результаты , что запроса для построения реального запроса:

query1 = "select column_name from sysibm.syscolumns" + 
     " where owner = 'pax' and table_name = 'movies'" + 
     " order by column_name" 
rs = exec(query1) 
query2 = "select" 
sep = " " 
foreach colm in rs: 
    query2 += sep + colm["column_name"] 
    sep = ", " 
query2 += " from movies order by rating" 
rs = exec(query2) 
// Now you have the rs recordset with sorted columns. 

Однако, вы действительно должны критически проанализировать все запросы, которые выбирают * - в подавляющем большинстве случаев это не нужно и неэффективно. И представление данных - это то, что, вероятно, должно быть сделано уровнем представления, а не самой СУБД - необходимо, чтобы СУБД оставалась для того, чтобы как можно более эффективно возвращать данные.

+0

Хмм, я думаю, мне нужно прибегнуть к хорошему старым методам сортировки строк: –

+1

Я согласен с этим, НИКОГДА не используйте * в производственном коде. Вы никогда не знаете, когда кто-то позже добавляет некоторый столбец, который НЕ должен быть указан, например, для обеспечения безопасности. Всегда создавайте запрос для извлечения только нужных столбцов. И если вы хотите сделать это динамически, сделайте это, но обязательно обратите внимание на это очень заметно для других разработчиков. –

+0

Еще одно, если использование SQL-представлений * имеет больше побочных эффектов в том случае, если базовые таблицы изменены (новый или удаленный столбец), представление не обновляется, поэтому может не отображаться новые столбцы. Существующие столбцы могут быть заменены, поскольку выбор вида столбца по индексу, который они имели при создании представления. –

0

Вы можете просто указать столбцы, которые вы хотите выбрать:

SELECT age, name, sex FROM Table 

Столбцы будут отображаться в том же порядке, как вы указали их в запросе.

+0

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

4
  • Невозможно сделать это автоматически без динамического SQL.
  • SELECT * не рекомендуется и не сортирует имена столбцов
  • Вы должны были бы явно делать SELECT age, name, sex FROM

На уровне SQL, это не имеет значения. Не имеет значения для любого объекта кода клиента.

Если это важно, то сортируйте, когда вы представляете данные клиенту.

Извините, это просто так ...

3

Стандарт SQL-92 указывает, что при использовании SELECT * столбцы ссылаются в восходящей последовательности их порядкового положения в таблице. Соответствующие разделы: 4.8 (столбцы) и 7.9 (спецификация запроса). Я не знаю каких-либо расширений поставщика для стандарта, которые позволяли бы столбцам возвращаться в любом другом порядке, вероятно, потому, что использование SELECT * обычно не рекомендуется.

Вы можете использовать SQL DDL, чтобы гарантировать, что порядковые позиции столбцов соответствуют желаемому алфавитному порядку. Тем не менее, это будет работать только так, как вы хотите, если ссылаетесь на таблицу sinlge в предложении FROM. Если ссылаются две таблицы, SELECT * вернет столбцы из первой таблицы в порядковом порядке порядка, за которыми следуют столбцы второй таблицы в порядковой позиции, поэтому столбцы полного набора результатов могут быть не в алфавитном порядке.

9

Это генерирует запрос со всеми столбцами, упорядоченными по алфавиту в инструкции select.

DECLARE @QUERY VARCHAR(2000) 
DECLARE @TABLENAME VARCHAR(50) = '<YOU_TABLE>' 

SET @QUERY = 'SELECT ' 
SELECT @QUERY = @QUERY + Column_name + ', 
' 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TABLENAME 
ORDER BY Column_name 

SET @QUERY = LEFT(@QUERY, LEN(@QUERY) - 4) + ' 
FROM '+ @TABLENAME 

PRINT @QUERY 
EXEC(@QUERY) 
+1

Предполагается, что запрос всегда будет запускаться ad-hoc, но также является хорошей отправной точкой, если плакат соответствует динамическому sql. – RThomas

+2

Работала для меня, с этой ревизией меняя левый оператор (len) - от 4 до -1 – Brian

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