SQL Listing all column names alphabetically

后端 未结 8 1869
天命终不由人
天命终不由人 2020-12-16 11:39

I know that

SELECT * FROM Table

will list all columns in the table, but I am interested in listing the columns in alphabetical order.

8条回答
  •  粉色の甜心
    2020-12-16 12:10

    A different approach would be to arrange all columns alphabetically by altering the table via a SQL procedure. I created one for a couple of the tables in which my users prefer the alphabetic layout while still using the simplified SELECT * statement.

    This code should arranged my index first and then organise all other columns from A-Z. It may be different for your instance but is a good starting point.

    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 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')
    
    

    Hope this helps!

提交回复
热议问题