有没有办法获得一列指示一行中的NULL字段数?这将在SELECT语句中。
例如:
Field1 Field2 Num_Null
-----------------------
NULL "A" 1
更新:我想要这个查询,以便我可以根据给定图书的Affiliates销售数量进行排序。所以有3个分支机构的排序高于2个,无论哪个。我的数据库中有大约七个附属机构,这可能会增长。因此,任何要求指定每个Affiliate字段的查询都可能太长
表格:
Affiliates_Cache - 主键是Affiliate_ISBN,具有各种关联公司的书籍价格(如果没有,则为NULL)。 Affiliates_Cache是我想要计算NULL数的那个
答案 0 :(得分:3)
我不确定是否有更简洁的方法,但这应该有效:
SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM YourTable;
测试用例:
CREATE TABLE YourTable (Field1 varchar(10), Field2 varchar(10));
INSERT INTO YourTable VALUES (NULL, 'A');
INSERT INTO YourTable VALUES ('B', 'C');
INSERT INTO YourTable VALUES ('B', NULL);
INSERT INTO YourTable VALUES (NULL, NULL);
结果:
+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL | A | 1 |
| B | C | 0 |
| B | NULL | 1 |
| NULL | NULL | 2 |
+--------+--------+----------+
4 rows in set (0.00 sec)
更新:继续更新的问题:
如果您的表格中的列看起来像affiliate_1
,affiliate_2
等,这很少是一个好主意,因为您将数据与元数据混合在一起。通常,建议的修复方法是使用另一个从属表来表示用户与关联公司之间的关系,如下例所示:
CREATE TABLE users (
user_id int,
user_name varchar(100),
PRIMARY KEY (user_id)
) ENGINE=INNODB;
CREATE TABLE users_affiliates (
user_id int,
affiliate_name varchar(100),
PRIMARY KEY (user_id, affiliate_name),
FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
然后按联盟会员的数量对users
表进行排序将如下所示:
SELECT u.*, d_tb.num_aff
FROM users
JOIN (
SELECT user_id, COUNT(*) num_aff
FROM users_affiliates
GROUP BY user_id
) d_tb ON (d_tb.user_id = u.user_id)
ORDER BY d_tb.num_aff DESC;
优点很多,但最重要的是它使上面的查询易于编写,并且足够灵活,可以与任意数量的关联公司合作(不受您分配的列数限制)。
答案 1 :(得分:0)
这个查询怎么样? (参考Daniel给出的测试用例。)
SELECT Field1, Field2, (2 - (COUNT(ALL Field1)+COUNT(ALL Field2))) Num_Null
FROM @YourTable
GROUP BY Field1, Field2
答案 2 :(得分:0)
保持简单和标准:
SELECT Field1, Field2,
CASE WHEN Field1 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN Field2 IS NULL THEN 1 ELSE 0 END
AS Num__Null
FROM YourTable;
完整的测试用例:
WITH YourTable (Field1, Field2)
AS
(
SELECT CAST(Field1 AS VARCHAR(10)),
CAST(Field2 AS VARCHAR(10))
FROM (
VALUES (NULL, 'A'),
('B', 'C'),
('B', NULL),
(NULL, NULL)
) AS YourTable (Field1, Field2)
)
SELECT Field1, Field2,
CASE WHEN Field1 IS NULL THEN 1 ELSE 0 END
+ CASE WHEN Field2 IS NULL THEN 1 ELSE 0 END
AS Num__Null
FROM YourTable;