我想知道在SQL中计算行的空列的可能性,我有一个表Customer,它有一个可以为空值的值,简单地说,我想要一个查询返回某个行(某个客户)的null列数的整数。
发布于 2011-12-22 05:21:19
此方法为空列分配1或0,并将它们全部相加。希望您在这里没有太多可以为空的列……
SELECT
((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END)
...
...
+ (CASE WHEN col10 IS NULL THEN 1 ELSE 0 END)) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id
请注意,如果您的关系型数据库管理系统支持IF()
,您也可以使用它在语法上更清晰地实现这一点。
SELECT
(IF(col1 IS NULL, 1, 0)
+ IF(col2 IS NULL, 1, 0)
+ IF(col3 IS NULL, 1, 0)
...
...
+ IF(col10 IS NULL, 1, 0)) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id
我在一个表格上测试了这个模式,它看起来工作正常。
发布于 2011-12-22 05:32:11
不幸的是,在标准的SQL语句中,您必须输入要测试的每一列,要以编程方式测试所有列,您可以使用T-SQL。但需要提醒的是,请确保您使用的是真正的NULL,您可以拥有数据库不会识别为真正的NULL的空白存储值(我知道这听起来很奇怪)。
您可以通过在如下语句中捕获空值和NULLS来避免这种情况:
CASE WHEN col1 & '' = '' THEN 1 ELSE 0 END
或者在一些数据库中,如Oracle (不确定是否有其他数据库),您将使用:
CASE WHEN col1 || '' = '' THEN 1 ELSE 0 END
发布于 2011-12-22 05:34:28
您不需要声明RDBMS。对于SQL Server 2008...
SELECT CustomerId,
(SELECT COUNT(*) - COUNT(C)
FROM (VALUES(CAST(Col1 AS SQL_VARIANT)),
(Col2),
/*....*/
(Col9),
(Col10)) T(C)) AS NumberOfNulls
FROM Customer
https://stackoverflow.com/questions/8596500
复制相似问题