【问题标题】:SQL SELECT * FROM tbl (HIDE 1 COLUMN)SQL SELECT * FROM tbl(隐藏 1 列)
【发布时间】:2011-09-19 14:14:24
【问题描述】:

我正在尝试做SELECT * FROM tbl,但在 20 列中我不希望选择 1 个特定列。有没有一种动态的方式来做到这一点?只是讨厌在查询中指定 19 列!

【问题讨论】:

  • 只有 19 个?普肖。说真的,如果这对您来说是一个很大的问题,请将其设为存储过程。或者这个:stackoverflow.com/questions/9122/…
  • @josh.trow : 动态 SQL 并不是真正的答案:合同和结果集可以随着表的变化而随机变化。
  • @gbn:这不是重点吗?
  • @josh.trow :它经常破坏客户端代码...

标签: mysql sql sql-server select


【解决方案1】:

只需指定列。无论如何,您应该一直这样做,因为 select * 是一个非常糟糕的编程选择。我不了解 mysql,但在 SQL Server 中,我可以从对象浏览器中拖动所有列并删除我不想要的列,这需要几秒钟。也许您使用的界面具有类似的功能。

【讨论】:

    【解决方案2】:

    试试这个。正如他所说,SQL 并不漂亮。

    Select all columns except one in MySQL?

    【讨论】:

      【解决方案3】:

      好吧,你(或我)可以花一些时间编写一些动态 sql 来查询表中的列,生成一个 sql 语句减去你要忽略的列,然后执行该动态 sql。

      或者您可以深吸一口气,为 19 列编写代码。

      我知道我会选择哪个。我知道哪种方式更易于维护且不易出错。

      【讨论】:

        【解决方案4】:

        有趣的问题,但直接答案是否定的,那是不可能的。但是,您可以使用视图或存储过程,它允许您写出 19 列一次,然后使用 SELECT * FROM viewexec storedproc 调用存储过程或视图

        这里唯一的问题是,如果您向表中添加/删除/重命名列,则需要更新对象(视图或存储过程)以反映新的/删除/重命名的列。

        【讨论】:

          【解决方案5】:

          insded的star写上所需的列名在那个,, e.i是

          SELECT name,password...etc FROM tbl
          

          【讨论】:

            【解决方案6】:

            我同意所有的答案。做“select * from ...”的优点

            但是,如果您真的想要,您可以在临时表中执行“选择 *”,执行“更改表”以删除不需要的列,然后从临时表中“选择 *”。

            仍然...不是很好,因为重点是,如果您的表结构发生变化(并获得一些额外的列),您选择的数据的消费者现在将获得比他们预期的更多的东西。 “Select *”在大多数情况下只是惰性编码。

            【讨论】:

              【解决方案7】:
              DELIMITER ;;
              CREATE PROCEDURE sp_hide_cols_sql_all(v_table varchar(60))
              BEGIN
              
               DECLARE v_query VARCHAR(1000);
              
                  SELECT CONCAT('SELECT ', GROUP_CONCAT(distinct c.column_name) , ' FROM  ',v_table) INTO v_query from information_schema.`COLUMNS` c where c.table_name = v_table and c.column_name<>'id' and table_schema=DATABASE();
              
                         SET @sql = v_query;
                         PREPARE stmt FROM @sql;
                         EXECUTE stmt;
                         DEALLOCATE PREPARE stmt;
              END ;;
              DELIMITER ;
              
              CALL sp_hide_cols_sql_all('table_name');
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-11-28
                • 2023-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多