27

我知道

SELECT * FROM Table

将列出表中的所有列,但我有兴趣按字母顺序列出列。

比如说,我有三列,“姓名”、“年龄”和“性别”。

我希望按格式组织列

|age| |name| |sex|

是否有可能用 SQL 做到这一点?

4

8 回答 8

15

这将生成一个查询,其中所有列在 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)
于 2012-05-08T12:48:35.727 回答
13

是的,没有:-)

SQL 本身并不关心列的顺序,但是,如果您要使用:

select age, name, sex from ...

您会发现它们可能是按此顺序出现的(尽管我不确定 SQL 标准是否强制执行此操作)。

现在你可能不想这样做,但有时生活并不公平 :-)

您还可以使用 DBMS 数据定义表来动态构建查询。这是不可移植的,但大多数 DBMS 都提供这些表(例如 DB/2's SYSIBM.SYSCOLUMNS),您可以从那里以有序的方式选择列名。就像是:

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.

但是,您确实应该严格检查所有选择的查询*- 在绝大多数情况下,它是不必要且低效的。数据的表示可能应该由表示层完成,而不是 DBMS 本身——应该让 DBMS 以尽可能有效的方式返回数据。

于 2010-11-02T08:03:23.497 回答
4
  • 如果没有动态 SQL,就无法自动执行此操作。
  • SELECT *不推荐,不会对列名进行排序
  • 你必须明确地做SELECT age, name, sex FROM

在 SQL 级别,这无关紧要。对任何客户端代码对象都没有关系-

如果它很重要,那么在您将数据呈现给客户时进行排序。

对不起,就是这样……

于 2010-11-02T08:07:38.810 回答
3

SQL-92 标准规定,在使用SELECT *列时,按它们在表中的序号位置的升序引用。相关部分为 4.8(列)和 7.9(查询规范)。我不知道标准的任何供应商扩展允许以任何其他顺序返回列,可能是因为SELECT *通常不鼓励使用。

您可以使用 SQL DDL 来确保列的序号位置与所需的字母顺序相匹配。但是,这只会以您在FROM子句中引用单个表时所需的方式起作用。如果引用了两个表,SELECT *将按序号位置顺序返回第一个表中的列,然后按序号位置返回第二个表的列,因此完整的结果集的列可能不是按字母顺序排列的。

于 2010-11-02T10:28:29.660 回答
2

如果您只是想在 SQL Server 上查找列。

SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTableThatCouldMaybeNeedNormalising'
order by COLUMN_NAME
于 2020-03-31T10:24:53.163 回答
0

您可以只指定要选择的列:

SELECT age, name, sex FROM Table

列将按照您在查询中指定的顺序显示。

于 2010-11-02T07:58:24.200 回答
0

另一种方法是通过 SQL 过程更改表来按字母顺序排列所有列。我为几个表创建了一个,其中我的用户更喜欢字母布局,同时仍然使用简化的SELECT *语句。

此代码应首先排列我的索引,然后从 AZ 组织所有其他列。您的实例可能会有所不同,但这是一个很好的起点。

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

希望这可以帮助!

于 2020-02-24T12:45:33.873 回答
-1

是的。可以使用以下命令。

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

它将按字母顺序显示表格的所有列。

于 2018-03-29T09:38:36.317 回答