我正在尝试SELECT * FROM tbl
,但在20列中,我不希望选择1个特定列。有没有动态的方法呢?只是讨厌在查询中指定19列!
答案 0 :(得分:9)
只需指定列即可。无论如何,你应该一直这样做,因为select *是一个非常糟糕的编程选择。我不知道mysql但是在SQL Server中我可以从对象浏览器中拖动所有列并删除我不想要的列,这需要几秒钟。也许您使用的界面具有类似的功能。
答案 1 :(得分:2)
试一试。就像他说的那样,SQL并不漂亮。
答案 2 :(得分:1)
你(或我)可能花一点时间编写一些动态sql来查询表中的列,生成一个sql语句减去你想忽略的列,然后执行那个动态的sql。
或者你可以深呼吸并为19列编码。
我知道我会选择哪一个。我知道哪种方式更易于维护且不易出错。
答案 3 :(得分:0)
有趣的问题,但直接的答案是否定的,这是不可能的。但是,您可以使用视图或存储过程,只允许您写出19列,然后使用SELECT * FROM view
或exec storedproc
此处唯一的问题是,如果向表中添加/删除/重命名列,则需要更新对象(视图或存储过程)以反映新的/已删除/重命名的列。
答案 4 :(得分:0)
坚持明星写所需的列名在那里,, e.i是
SELECT name,password...etc FROM tbl
答案 5 :(得分:0)
我同意所有答案。做“select * from ...”的优点
但是,如果你真的想要,你可以在临时表中做一个“select *”,做一个“alter table”来删除你不想要的列,然后从临时表中执行“select *”。
仍然......不是很好,因为主要的一点是,如果您的表结构发生变化(并获得一些额外的列),您选择的数据的消费者现在将获得比他们预期更多的消费者。在大多数情况下,“选择*”只是延迟编码。
答案 6 :(得分:0)
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');