如何在 SQL 中 select 没有空值的行(在任何列中)?
how to select rows with no null values (in any column) in SQL?
我有一个 table 叫 table1
它有 100 列:{col1
, col2
, ...,col100
}
我了解如何 SELECT
行 不 在特定列中包含空值,例如 col1
:
SELECT *
FROM table1
WHERE col1 IS NOT NULL
How do I SELECT
all rows that do not contain null values in any column
尝试
SELECT *
FROM table1
WHERE * IS NOT NULL
但这 returns MySQL
(我正在使用)
中的一个错误
获取每列的长度并将它们相乘。如果结果不为空,则所有列都是非空值。尝试以下示例代码。由于我没有使用多个 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
虽然我建议写出每个列名称并按照建议重构您的 table,但这里有一个使用 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;
您需要明确列出每一列。我会推荐:
select t.*
from t
where col1 is not null and col2 is not null and . . .
有些人可能更喜欢更简洁(但更慢)的方法,例如:
where concat(col1, col2, col3, . . . ) is not null
尽管您可以使用元数据 table 或电子表格构建查询,但实际上这并不是一种简单的表达方式。
到 return 行中任何列都没有空值:(在 MYSQL 中)
SELECT *
FROM 表名
WHERE 表名.* 不为空
我有一个 table 叫 table1
它有 100 列:{col1
, col2
, ...,col100
}
我了解如何 SELECT
行 不 在特定列中包含空值,例如 col1
:
SELECT *
FROM table1
WHERE col1 IS NOT NULL
How do I
SELECT
all rows that do not contain null values in any column
尝试
SELECT *
FROM table1
WHERE * IS NOT NULL
但这 returns MySQL
(我正在使用)
获取每列的长度并将它们相乘。如果结果不为空,则所有列都是非空值。尝试以下示例代码。由于我没有使用多个 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
虽然我建议写出每个列名称并按照建议重构您的 table,但这里有一个使用 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;
您需要明确列出每一列。我会推荐:
select t.*
from t
where col1 is not null and col2 is not null and . . .
有些人可能更喜欢更简洁(但更慢)的方法,例如:
where concat(col1, col2, col3, . . . ) is not null
尽管您可以使用元数据 table 或电子表格构建查询,但实际上这并不是一种简单的表达方式。
到 return 行中任何列都没有空值:(在 MYSQL 中)
SELECT *
FROM 表名
WHERE 表名.* 不为空