当我想选择期望 foo 和 bar 的所有列时,我通常只是在select语句中明确列出所有其他列。
select a, b, c, d, ... from ...
但如果表有十几列,这对于简单的方法来说是繁琐的过程。我想做的是类似下面的伪语句:
select * except(foo, bar) from ...
我还想知道,如果有一个函数来过滤掉由多个列组成的结果中的行,那么如果多行在所有中都有相同的内容列。换句话说,将过滤掉重复的行。
------------------------
A | B | C
------------------------ ====> ------------------------
A | B | C A | B | C
------------------------ ------------------------
答案 0 :(得分:2)
您可以查询INFORMATION_SCHEMA
db并获取该表的列(除了两个),例如:
SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<foo,bar>,', '')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<your_table>' AND TABLE_SCHEMA = '<database>';
获得列列表后,您可以在选择查询中使用该列表。
答案 1 :(得分:1)
您可以根据此表创建包含除这两列之外的所有列的视图,然后每次使用此视图
select * from view
所有列上的简单组将删除此类重复项。还有其他选项 - distinct和row_number。
答案 2 :(得分:0)
select * except(foo, bar) from
这是SO上经常要求的功能。但是,它还没有达到SQL标准,我不知道任何支持它的SQL产品。我想当产品经理要求他们的开发人员,MVP,用户组等测量对这个预期功能的热情时,他们大多听到,“SELECT * FROM
被认为是危险的,我们需要保护那些不知道他们是什么的新用户正在做等等。“
您可能会发现使用NATURAL JOIN
而不是INNER JOIN
等有用,它会从结果表格表达式中删除重复的列,例如
SELECT *
FROM Table1 t1
INNER JOIN Table2 t2
ON t1.foo = t2.foo
AND t1.bar = t2.bar;
将导致两列名为foo
,两列名为bar
(可能还有其他重复名称),可能会以某种方式重复删除,例如通过为t1
迫使您使用的范围变量名t2
和INNER JOIN
添加后缀。
鉴于:
SELECT *
FROM Table1 NATURAL JOIN Table2;
不需要使用范围变量(这是一件好事),因为在结果中只有一个名为foo
的列和一个名为bar
的列。
要删除重复的行以及列,将隐含的SELECT ALL *
更改为显式SELECT DISTINCT *
,例如
SELECT DISTINCT *
FROM Table1 NATURAL JOIN Table2;
这样做可能会减少您对所需SELECT ALL BUT { these columns }
功能的需求。
当然,如果你这样做,你会被告知,“NATURAL JOIN
被认为是危险的,我们需要保护你自己,以防你不知道自己在做什么,等等。” :)