如果找不到行-mysql,则返回默认值

时间:2014-05-09 06:52:01

标签: mysql

我构建查询以从数据库中搜索多行,例如

SELECT 
  * 
FROM
  table1 
WHERE col1 = '012311' 
  OR col1 = '0123631' 
  OR col1 = '091233' 
  OR col1 = '092111' 

这里它返回前3个值,因为它们存在于表中,但它不返回最后一个值,因为它不在表中。那么如果没有找到该值的行,如何在查询中设置我的默认值?

5 个答案:

答案 0 :(得分:7)

有几种方法,取决于数据集。这是一种方式:

SELECT *, 
IFNULL(
    ( SELECT col1 FROM table1 
        WHERE col1 IN ('012311','0123631','091233','092111') 
    ),
    'some_value'
) AS my_col1
FROM table1;

不需要复制+粘贴,您必须根据具体情况进行调整。

答案 1 :(得分:4)

在MySQL中,如果没有找到行,即返回NULL时,可以使用IFNULL返回指定的值 前 -

SELECT IFNULL( (SELECT col1 FROM table1 WHERE col1 in (your_list)) ,'default_value_you_want_to_return');

你可以在这里看到IFNULL的例子 - IFNULL Example

答案 2 :(得分:1)

我想在这个+ 2.5yo问题上加入,并根据WHERE子句做出假设,Jadeja RJ只想返回四行而不是整个表(也许表有100,000行使结果集非常臃肿)。

我不想在SELECT中使用greedy *,所以我将col1用作行标识符,col2作为其关联值。当然,可以根据需要指定更多列。 这是一种硬编码所需行数并标记缺失行的方法:

SELECT hardrows.col1,IFNULL(table1.col2,'Not Found')
FROM 
(
    (SELECT '012311' AS `col1`) UNION 
    (SELECT '0123631') UNION 
    (SELECT '091233') UNION 
    (SELECT '092111')
) AS `hardrows`
LEFT JOIN `table1`
    ON hardrows.col1=table1.col1;

当然,我正在使用这个建议进行多项假设。我不知道表中有多少行,需要声明多少个硬编码行,也不知道实际查询中是否存在可能使其效率低下的其他子句/表达式。优点是纯粹控制返回的行数。

最后,如果标识符数组由另一个数据库表提供,那么该表应该替换hardrows

答案 3 :(得分:0)

SELECT
     CASE WHEN col1 = NULL THEN "NULL" ELSE col1 END AS 'col1'
FROM table1
WHERE
     col1 = '012311'
     OR col1 = '0123631'
     OR col1 = '091233'
     OR col1 = '092111'

这可能与您正在寻找的内容一致,格式化。如果col1为NULL,则返回字符串“NULL”(可以替换)。如果col1为NOT NULL,则返回值结果。

希望这有效!

答案 4 :(得分:0)

我创立的最好方法是:

SELECT COALESCE(col1, 'defaultValue') col1, COUNT(*) cRows 
FROM table1 
WHERE colx = 'filter';

此查询返回 2 列:

  • 第一个是使用默认值搜索的列的值,以防该行不存在。
  • 第二列返回表中带有过滤器的行数