Mysql 合并和IFNULL未按预期工作
我试图在查询中找不到行时输出默认行。 这是我的查询示例:Mysql 合并和IFNULL未按预期工作,mysql,null,Mysql,Null,我试图在查询中找不到行时输出默认行。 这是我的查询示例: 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 | +----
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,我们对场地“西”有一排,而对“东”没有一排。我尝试过搜索,发现我可以使用COALESCE,也尝试过IFNULL,但我只得到上面的输出。我也尝试了if(count(site)=0,“STE”,site),但我无法让它工作
我的预期结果是
+------+------------+-------+
| site | instrument | field |
+------+------------+-------+
| West | 0 | 0 |
| STE | NULL | NULL |
+------+------------+-------+
我希望你们能帮助我。提前感谢如果“STE”不在表1.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]
如果您对如何工作有疑问,请告诉我。coalesce()和ifnull()都是在行的基础上工作的,这意味着如果记录中存在空值,它们可以替换该空值。但是,他们无法创建不存在的记录,并且您没有任何与East(或STE)匹配的记录
一种可能的解决方案是创建一个表,其中包含站点
字段的所有可能值,您可以在此表上保留联接:
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
您的查询有它
站点在哪里('East'、'West')
。。。在站点有STE的地方,您希望如何获得一行?除非你有一个站点=NULL
它是STE还是East?我的印象是,在你的问题中,这两个词可以互换使用……在东方。在2016-09-07日期的表1中,站点东部没有行,所以我希望它只输出一行,当没有行可用时,有文本/数据“STE”+1用于保持主题。那不总是有“STE”行吗?我只想在该行不存在的情况下添加该行。我得到语法错误:在“FULL”行,“FULL”在此位置不是有效的输入。哦,它不应该是FULL OUTER JOIN吗?我将再次尝试更改它,给出了右连接/左连接示例。我没有看到你在使用mysql,根据互联网社区的说法,mysql不支持完全连接。。也许我做错了什么,因为如果网站不存在,它仍然不会创建“null”/“ste”行。它仍然只是输出West | 0 | 0 |
,你希望我根据这两条评论找出你仍然在以错误的方式做什么?真的吗?对不起,我不是有意冒犯你的。只是我在你的例子中用同样的方法创建了另一个表,其中包含了所有可能的值,但它仍然只输出存在的值。你需要用你所做的所有步骤和得到的结果更新你的问题。否则我们帮不了你。