如何使用MySql查询显示所有非空和所有非空记录而不提及where子句中的所有列名?

时间:2017-11-29 11:27:40

标签: mysql sql

请考虑有八列(col1,col2,... col8),col1包含primary_key。

Table1
col1: val1
col2: val2
col3: NULL
col4: 
col5: NULL
col6: NULL
col7: 
col8: val8

尝试:

Select * from Table1 
WHERE col1 and col2 and col3 and col4 and col5 and col6 and col7 and col8 IS NOT NULL \G

预期:

但我不想在where子句中提及所有这些列名,因为我正在处理一个包含100列的大表。

请帮忙。 提前致谢。

1 个答案:

答案 0 :(得分:2)

你不能;某些东西,某处必须形成一个查询,其中提到了所有列名。也许你会知道,使用文本编辑器功能可以让你的生活更轻松,这对你有好处。

mySQL中的以下查询

SHOW COLUMNS FROM mydb.mytable

应该产生这样的输出:

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+

如果您使用电源文本编辑器(此示例适用于sublime,大多数优秀的文本编辑器都具有此功能),它将具有列选择模式。在崇高的情况下,如果使用鼠标中键拖动选区,则可以突出显示仅列名称的方形区域

enter image description here

取下这些并将它们粘贴到其他地方,然后再次使用鼠标中键绘制一条垂直线,在行的末尾为零,然后开始输入:

enter image description here enter image description here

如您所见,sublime同时在所有行上键入。这可以大大减少您的查询编写家务和无聊的重复部分。阅读您最喜欢的文本编辑器的高级功能。我喜欢崇高,因为它可以通过ctrl +单击在任何地方放置多个游标,然后同时键入所有这些 - 我还没有在任何其他编辑器中找到此功能:

enter image description here

如果表变化很大,那么您的其他选项是使用SQL在代码/中构建查询。这样的事情,也许是:

SELECT 'SELECT * FROM tableWhatever WHERE '
UNION ALL
SELECT CONCAT(`COLUMN_NAME`, ' is not null and ')
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename'
UNION ALL
SELECT '1=1'

它会产生这样的SQL(查询编辑器中的多个单元格的网格输出,然后将单元格复制出查询编辑器):

SELECT * FROM tableWhatever WHERE
 ID          is not null and 
 Name        is not null and 
 CountryCode is not null and 
 District    is not null and 
 Population  is not null and 
 1=1

它在语法上是正确的。如果需要,可以使用退格键删除最后一个AND和1 = 1.

使用SQL编写SQL也可以节省大量的输入。