SQL SELECT * FROM tbl(隐藏 1 列)

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于SQL SELECT * FROM tbl(隐藏 1 列)的主要内容,如果未能解决你的问题,请参考以下文章

SQL一对多特殊查询,取唯一一条

sql - 添加子查询时查询语法问题

yii2 怎么执行原生态的insert

MySQL UNION ALL 性能调优

左链接和右链接及内链接详解

FOR中的SQL查询动态表名