我在查询中找不到行时尝试输出默认行。 这是我的查询示例:
SELECT
COALESCE(site, 'STE') as site,
instrument,
field
FROM Table1
WHERE site IN ('East', 'West')
AND DATE(tstamp) = "2016-09-07"
ORDER BY id desc
输出
+------+------------+-------+
| site | instrument | field |
+------+------------+-------+
| West | 0 | 0 |
+------+------------+-------+
对于tsamp 2016-09-07我们有一排网站" West"并且#34; East"没有排。我试图搜索并发现我可以使用COALESCE并尝试了IFNULL,但我只是得到了上面的输出。我也试过if(count(site)= 0," STE",site)但是我无法让它工作。
我的预期结果是
+------+------------+-------+
| site | instrument | field |
+------+------------+-------+
| West | 0 | 0 |
| STE | NULL | NULL |
+------+------------+-------+
我希望你们能帮助我。提前致谢
答案 0 :(得分:1)
coalesce()和ifnull()都基于行工作,这意味着如果记录中存在该null值,它们可以替换空值。但是,它们无法创建不存在的记录 - 并且您没有任何与East(或STE)匹配的记录。
一种可能的解决方案是创建一个包含site
字段所有可能值的表格,您可以在此表格中保持联接:
SELECT
COALESCE(Table1.site, "STE") as site,
Table1.instrument,
Table1.field
FROM LookupTable lt
LEFT JOIN Table1 ON lt.site=Table1.site
WHERE lt.site IN ('East', 'West')
AND DATE(Table1.tstamp) = "2016-09-07"
ORDER BY id desc
答案 1 :(得分:0)
如果'STE'不在table1.site中,那么它将不会返回到结果中。
你可以做一个工会:
SELECT
site,
instrument,
field
FROM (SELECT 'West' [Site], 0 [instrument], 0 [field]) table1
WHERE site IN ('East', 'West')
UNION
SELECT 'STE', NULL, NULL
请注意,使用“STE”您要查找列名“STE”,而不是值'STE'(单引号)
修改强>
您需要一个控制表来指示要查找的值,或者您必须对规则进行硬编码。如果没有先指定应该存在的东西,你就无法找到遗漏的东西。
这是一个选项:
--Create and populate reference table "sites"
create table sites
([site] char (4))
INSERT INTO sites VALUES ('East')
INSERT INTO sites VALUES ('West')
-- Query against reference table
SELECT
ISNULL(table1.site, 'STE'),
instrument,
field
FROM (SELECT 'West' [Site], 0 [instrument], 0 [field]) table1
RIGHT JOIN sites on table1.[Site] = sites.[Site]
--or
-- Query against reference table
SELECT
ISNULL(table1.site, 'STE'),
instrument,
field
FROM sites
LEFT JOIN (SELECT 'West' [Site], 0 [instrument], 0 [field]) table1 on table1.[Site] = sites.[Site]
如果您对此如何运作有疑问,请与我们联系。