Tom*_*icz 346 mysql select wildcard
我正在尝试使用select语句来获取某个MySQL表中的所有列,除了一个.有一个简单的方法吗?
编辑:此表中有53列(不是我的设计)
Mah*_*lid 209
实际上有一种方法,你需要有权利这样做...
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
Run Code Online (Sandbox Code Playgroud)
更换 <table>, <database> and <columns_to_omit>
bor*_*nac 52
在mysql定义(手册)中没有这样的东西.但是如果你有很多列col1,...... col100,则以下内容可能很有用:
mysql> CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
mysql> ALTER TABLE temp_tb DROP col_x;
mysql> SELECT * FROM temp_tb;
Run Code Online (Sandbox Code Playgroud)
Bri*_*ess 42
在这种情况下,View会更好吗?
CREATE VIEW vwTable
as
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
Run Code Online (Sandbox Code Playgroud)
Mik*_*one 35
你可以做:
SELECT column1, column2, column4 FROM table WHERE whatever
Run Code Online (Sandbox Code Playgroud)
没有得到column3,虽然你可能正在寻找更通用的解决方案?
Sea*_*n O 29
如果您要排除字段的值,例如,出于安全问题/敏感信息,您可以将该列检索为null.
例如
SELECT *, NULL AS salary FROM users
Run Code Online (Sandbox Code Playgroud)
Tho*_*ens 21
据我所知,没有.你可以这样做:
SELECT col1, col2, col3, col4 FROM tbl
Run Code Online (Sandbox Code Playgroud)
并手动选择所需的列.但是,如果你想要很多列,那么你可能只想做一个:
SELECT * FROM tbl
Run Code Online (Sandbox Code Playgroud)
并且忽略你不想要的东西.
在您的特定情况下,我建议:
SELECT * FROM tbl
Run Code Online (Sandbox Code Playgroud)
除非你只想要几列.如果您只想要四列,那么:
SELECT col3, col6, col45, col 52 FROM tbl
Run Code Online (Sandbox Code Playgroud)
没问题,但是如果你想要50列,那么任何使查询的代码都会变得(太?)难以阅读.
小智 16
在尝试@Mahomedalid和@Junaid的解决方案时,我发现了一个问题.所以想分享它.如果列名称具有空格或连字符(如签入),则查询将失败.简单的解决方法是在列名称周围使用反引号.修改后的查询如下
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
Run Code Online (Sandbox Code Playgroud)
Sta*_*rds 11
如果您不想选择的列中包含大量数据,并且由于速度问题而您不想包含它,并且您经常选择其他列,我建议您创建一个新表使用您通常不会使用原始表的键选择的一个字段,并从原始表中删除该字段.在实际需要额外字段时加入表.
我的主要问题是我在连接表时得到的很多列.虽然这不是您的问题的答案(如何从一个表中选择除了某些列之外的所有列),但我认为值得一提的是,您可以指定从特定表中获取所有列,而不是仅指定.table.
以下是一个如何非常有用的示例:
select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode from users left join user_meta as phone on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') ) left join user_meta as zipcode on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') )
结果是users表中的所有列,以及从元表连接的另外两列.
小智 5
是的,尽管它可能是高 I/O,具体取决于表,这是我为它找到的解决方法。
SELECT *
INTO #temp
FROM table
ALTER TABLE #temp DROP COlUMN column_name
SELECT *
FROM #temp
Run Code Online (Sandbox Code Playgroud)
我喜欢这个回答,@Mahomedalid除了这个事实,评论来自@Bill Karwin.提出的可能问题@Jan Koritak是真的,我遇到了这个,但我找到了一个技巧,只是想在这里分享面对这个问题的任何人.
我们可以用Prepared语句的子查询中的where子句替换REPLACE函数,如下所示:
使用我的表和列名称
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
Run Code Online (Sandbox Code Playgroud)
因此,这将仅排除字段,id但不排除company_id
希望这能帮助任何寻求解决方案的人.
问候
| 归档时间: |
|
| 查看次数: |
315243 次 |
| 最近记录: |