mysql 如何在SQL中选择没有空值的行(在任何列中)?

fcwjkofz  于 2023-02-03  发布在  Mysql
关注(0)|答案(4)|浏览(190)

我有一个名为table1的表
它有100列:{ col1col2,...,col100 }
我知道如何SELECT行 * 不 * 在特定列中包含空值,例如col1

SELECT *
FROM table1
WHERE col1 IS NOT NULL

如何SELECT所有在任何列 * 中不包含空值的行 *

尝试

SELECT *
FROM table1
WHERE * IS NOT NULL

但这在MySQL(我正在使用)中返回一个错误

cx6n0qe3

cx6n0qe31#

您需要显式地列出每一列。我建议:

select t.*
from t
where col1 is not null and col2 is not null and . . .

有些人可能更喜欢更简洁(但速度更慢)的方法,例如:

where concat(col1, col2, col3, . . . ) is not null

这实际上不是一种简单的表达方式,尽管您可以使用元数据表或电子表格构造查询。

xfyts7mz

xfyts7mz2#

虽然我建议写出每个列名并按照建议重构您的表,但这里有一个使用dynamic sql的选项:

SET @sql = NULL;
SELECT CONCAT('SELECT * FROM table1 WHERE ', 
              GROUP_CONCAT(c.COLUMN_NAME SEPARATOR ' IS NOT NULL AND '), 
              ' IS NOT NULL') INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = 'table1'
ORDER BY c.ORDINAL_POSITION;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
lx0bsm1f

lx0bsm1f3#

要返回任何列中没有空值的行:(在PostgresSQL中)
选择 *
发件人 * 表格名称 *
WHERE * 表名 *. * 不为空

nxowjjhe

nxowjjhe4#

获取每列的长度并将它们相乘。如果结果不为空,则所有列都是非空值。尝试以下示例代码。由于我没有使用多个AND子句,因此这是一个更好的方法。

CREATE TABLE #Temp (OdSal INT,NewSal INT,EmpName CHAR(20),IsCurrentEmp BIT)

INSERT INTO #Temp VALUES
(100,150,'Vikas',1),        -- No null records
(NULL,NULL,NULL,NULL),      -- all records are null
(NULL,NULL,'Nayanthara',1), -- more than 1 column is null
(NULL,150,'Priyamani',1)    -- only one column is null

--Will return only one row
SELECT * FROM #Temp
WHERE LEN(OdSal) * LEN(NewSal) * LEN(EmpName) * LEN(IsCurrentEmp) IS NOT NULL

相关问题