【问题标题】:Return Default value if no row found如果未找到行,则返回默认值
【发布时间】:2014-05-09 06:52:01
【问题描述】:

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

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

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

【问题讨论】:

标签: mysql


【解决方案1】:

我创立的最佳方式是这样的:

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

此查询返回 2 列:

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

【讨论】:

    【解决方案2】:

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

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

    您可以在此处查看 IFNULL 的示例 - IFNULL Example

    【讨论】:

    • 返回错误“操作数应包含 1 列”
    • 在子查询中使用SELECT * FROM 是错误的,无论如何都会减慢整个查询的速度。
    • 如果嵌套查询在同一张表上,则不能在 INSERT SELECT 中使用它
    【解决方案3】:

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

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

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

    【讨论】:

    • 不工作。 . . .. 当没有找到值的行时,它不会返回任何东西
    【解决方案4】:

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

    我不想在 SELECT 中使用贪婪的 *,所以我将使用 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

    【讨论】:

      【解决方案5】:
      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 不为 NULL,则返回值结果。

      【讨论】:

        【解决方案6】:

        使用 UNION

        SELECT col_x FROM table_x
        UNION
        SELECT 'default_value';
        

        'default_value' 可以是任何数据类型。

        【讨论】:

          猜你喜欢
          • 2013-02-25
          • 2019-04-12
          • 2018-12-12
          • 2016-09-01
          • 2015-12-02
          • 2019-11-24
          • 2010-11-22
          • 2013-05-12
          • 1970-01-01
          相关资源
          最近更新 更多