如果数据集为空,MySQL将返回默认值

如果数据集为空,MySQL将返回默认值,mysql,r,select,coalesce,Mysql,R,Select,Coalesce,我正在尝试使用以下方法查询数据库: SELECT coalesce(value, "NA") as value FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) WHERE chrom = 1 AND site = 120 如果我在数据库中有一个条目,这个查询就可以正常工作。但是,如果找不到条目,它将返回一个空数据集。我想更改查询,以便如果在数据库表中找不到它,它仍将返回某种值(用于“value”),而不是一个空的数据集添加一个联合如何

我正在尝试使用以下方法查询数据库:

SELECT coalesce(value, "NA") as value 
FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) 
WHERE chrom = 1 AND site = 120

如果我在数据库中有一个条目,这个查询就可以正常工作。但是,如果找不到条目,它将返回一个空数据集。我想更改查询,以便如果在数据库表中找不到它,它仍将返回某种值(用于“value”),而不是一个空的数据集

添加一个联合如何

(   SELECT coalesce(value, "NA") as value 
    FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) 
    WHERE chrom = 1 AND site = 120
)
UNION ALL
(   SELECT 'NA' as value
    FROM mytable
    WHERE NOT EXISTS 
    (   SELECT coalesce(value, "NA") as value 
        FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) 
        WHERE chrom = 1 AND site = 120
    )
)
或者,如果您想执行一次合并,这样您就可以更容易地更改返回的部分(如果为null),您可以像这样从中进行选择

SELECT COALESCE(value, "NA") as value
FROM
(   
    (   SELECT value
        FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) 
        WHERE chrom = 1 AND site = 120
    )
    UNION ALL
    (   SELECT NULL as value
        FROM mytable
        WHERE NOT EXISTS 
        (   SELECT value as value 
            FROM mytable FORCE INDEX (chrs) FORCE INDEX (sites) 
            WHERE chrom = 1 AND site = 120
        )
    )
) t

一种(丑陋的)方法:创建一个只有一行的表(与该表中的数据无关),然后使用:

SELECT coalesce(m.value, "NA") from oneline left join mytable m on m.chrom=1 and m.site=120;
以下是您得到的:

mysql> select * from oneline;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0,00 sec)

mysql> select * from mytable;
+-------+-------+------+
| value | chrom | site |
+-------+-------+------+
| test  |     1 |  120 |
+-------+-------+------+
1 row in set (0,00 sec)

mysql> SELECT coalesce(m.value, "NA") from oneline left join mytable m on m.chrom=1 and m.site=120;
+-------------------------+
| coalesce(m.value, "NA") |
+-------------------------+
| test                    |
+-------------------------+
1 row in set (0,00 sec)

mysql> SELECT coalesce(m.value, "NA") from oneline left join mytable m on m.chrom=1 and m.site=119;
+-------------------------+
| coalesce(m.value, "NA") |
+-------------------------+
| NA                      |
+-------------------------+
1 row in set (0,00 sec)

你能发布一些相关数据吗?