web-dev-qa-db-ja.com

SQLすべての列名をアルファベット順にリスト

そんなこと知ってる

SELECT * FROM Table

テーブルのすべての列をリストしますが、列をアルファベット順にリストすることに興味があります。

たとえば、「名前」、「年齢」、「性別」の3つの列があるとします。

列をフォーマットで整理したい

|age| |name| |sex|

SQLでこれを行うことは可能ですか?

21
Shamim Hafiz

はいといいえ :-)

SQL自体は、列がどのような順序で出てくるかは関係ありませんが、使用する場合:

select age, name, sex from ...

あなたはおそらくそれらがこの順番で出てきたことに気付くでしょう(SQL標準がこれを義務付けているかどうかはわかりませんが).

今、あなたはwantをすることはできませんが、時々人生は公平ではありません:-)

また、DBMSデータ定義テーブルを使用してクエリを動的に構築することもできます。これは移植性はありませんが、ほとんどのDBMSはこれらのテーブル(DB/2のSYSIBM.SYSCOLUMNSなど)を提供しており、そこから列名を順番に選択できます。何かのようなもの:

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

次に、thatクエリの結果を使用して、実際のクエリを作成します。

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.

ただし、*を選択するすべてのクエリを批判的に調査する必要があります。ほとんどの場合、これは不必要で非効率的です。また、データのプレゼンテーションは、DBMS自体ではなく、おそらくプレゼンテーションレイヤーで行う必要があります。DBMSは、できるだけ効率的な方法でデータを返すようにしておく必要があります。

13
paxdiablo

これにより、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)
12
Maykol Rypka
  • 動的SQLなしでこれを自動的に行う方法はありません。
  • SELECT *は推奨されず、列名をソートしません
  • 明示的に行う必要がありますSELECT age, name, sex FROM

SQLレベルでは問題ではありません。クライアントコードオブジェクトには関係ありません。

重要な場合は、データをクライアントに提示するときに並べ替えます。

すみません、それだけです...

4
gbn

SQL-92標準では、SELECT *を使用する場合、列がテーブル内の序数の昇順で参照されるように指定されています。関連するセクションは4.8(列)と7.9(クエリ指定)です。おそらくSELECT *の使用が一般的に推奨されていないため、列を他の順序で返すことができるようにする標準のベンダー拡張については知りません。

SQL DDLを使用して、列の序数位置が目的のアルファベット順と一致することを確認できます。ただし、これは、FROM句でsinlgeテーブルを参照するときに必要な方法でのみ機能します。 2つのテーブルが参照されている場合、SELECT *は最初のテーブルの列を順序位置で返し、2番目のテーブルの列が順序位置で続くため、結果セット全体の列がアルファベット順にならない場合があります。

3
onedaywhen

選択する列を指定するだけです。

SELECT age, name, sex FROM Table

列は、クエリで指定したのと同じ順序で表示されます。

0
Kel

はい。以下のコマンドで可能です。

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('Your_Table_Name') order by column_name;

テーブルのすべての列がアルファベット順に表示されます。

0

SQL Serverで列を検索するだけの場合。

SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTableThatCouldMaybeNeedNormalising'
order by COLUMN_NAME
0
andrew pate

別のアプローチは、SQLプロシージャを介してテーブルを変更することにより、すべての列をアルファベット順に配置することです。ユーザーが単純化されたSELECT *ステートメント。

このコードでは、最初にインデックスを配置してから、AからZまでの他のすべての列を整理します。インスタンスによって異なる場合がありますが、出発点としては適しています。

DELIMITER ;;

DROP PROCEDURE IF EXISTS ALPHABETISE_TABLE_COLUMNS;

CREATE PROCEDURE ALPHABETISE_TABLE_COLUMNS(IN database_name VARCHAR(64), IN table_name_string VARCHAR(64), IN index_name_string VARCHAR(64))

BEGIN

    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE col_name VARCHAR(30) DEFAULT "";
    DECLARE col_datatype VARCHAR(10) DEFAULT "";
    DECLARE previous_col VARCHAR(30) DEFAULT col_name;

    SELECT COUNT(*) 
    FROM 
        (SELECT COLUMN_NAME 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = table_name_string) AS TEMP 
    INTO n;

    SET @Q= CONCAT('ALTER TABLE `',database_name,'`.`',table_name_string,'` CHANGE COLUMN `',index_name_string,'` `',index_name_string,'` BIGINT(20) NOT NULL FIRST');
    PREPARE exe FROM @Q;
    EXECUTE exe;
    DEALLOCATE PREPARE exe;

    SET n = n-1;
    SET i=1;

    WHILE i<n DO 


        SELECT COLUMN_NAME FROM 
            (SELECT COLUMN_NAME, @row_num:= @row_num + 1 as ind_rows 
            FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c 
            WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string 
            ORDER BY COLUMN_NAME ASC) as TEMP 
        WHERE ind_rows = i 
        INTO col_name;

        SELECT DATA_TYPE 
        FROM 
            (SELECT DATA_TYPE, @row_num:= @row_num + 1 as ind_rows 
            FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c 
            WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string 
            ORDER BY COLUMN_NAME ASC) as TEMP 
        WHERE ind_rows = i 
        INTO col_datatype;

        IF i = 1 THEN
            SET previous_col = index_name_string;
        ELSE
            SELECT COLUMN_NAME 
            FROM 
                (SELECT COLUMN_NAME, @row_num:= @row_num + 1 as ind_rows 
                FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c 
                WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string 
                ORDER BY COLUMN_NAME ASC) as TEMP 
            WHERE ind_rows = i-1
            INTO previous_col;
        END IF;

        IF col_datatype = 'varchar' THEN
            SET col_datatype = 'TEXT';
        END IF;

        select col_name, previous_col;
        IF col_name <> index_name_string OR index_name_string = '' THEN
            SET @Q= CONCAT('ALTER TABLE `',database_name,'`.`',table_name_string,'` CHANGE COLUMN `',col_name,'` `',col_name,'` ',col_datatype,' NULL DEFAULT NULL AFTER `',previous_col,'`');
            PREPARE exe FROM @Q;
            EXECUTE exe;
            DEALLOCATE PREPARE exe;
        END IF;
        SET i = i + 1;

    END WHILE;
END;
;;

DELIMITER ;

# NOTE: ASSUMES INDEX IS BIGINT(20), IF OTHER PLEASE ADAPT IN LINE 22 TO MEET DATATYPE
#
# CALL ALPHABETISE_TABLE_COLUMNS('database_name', 'column_name', 'index_name')

お役に立てれば!

0
Lewis Hepburn