Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 合并和IFNULL未按预期工作_Mysql_Null - Fatal编程技术网

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 |
,你希望我根据这两条评论找出你仍然在以错误的方式做什么?真的吗?对不起,我不是有意冒犯你的。只是我在你的例子中用同样的方法创建了另一个表,其中包含了所有可能的值,但它仍然只输出存在的值。你需要用你所做的所有步骤和得到的结果更新你的问题。否则我们帮不了你。