【问题标题】:Query not returning anything when no last_name value found未找到 last_name 值时查询不返回任何内容
【发布时间】:2019-12-15 18:47:10
【问题描述】:

我刚刚构建了这个新的条件查询,用于根据 display_as 值提取 first_name AND last_namecompany_name

Select If(`display_as` = 'individual',
    CONCAT(first_name, ' ', last_name)
   ,`company_name`) as name FROM `{$this->table}` WHERE `unique_id` = ? LIMIT 1

问题是,如果用户只有一个first_name 值,而no valuelast_name,则根本不会返回任何内容。

我该如何解决这个问题?

【问题讨论】:

  • 发生这种情况是因为任何涉及 NULL 和 NOT NULL 值的操作都会导致 NULL,但 IFNULL 和 COALESCE 除外,它们用于通过在 NULL 的情况下提供默认值来解决问题。给出的答案是函数用法的典型示例。

标签: mysql sql concat ifnull


【解决方案1】:

改用这个查询。

$sql = "Select If(`display_as` = 'individual',
    CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, ''))
   ,`company_name`) as name FROM `{$this->table}` WHERE `unique_id` = ? LIMIT 1";

【讨论】:

  • 我会亲自用 TRIM() 包围 CONCAT() 表达式,以在 NULL 的情况下删除尾随空格。
【解决方案2】:

试试这个:

Select
    If( `display_as` = 'individual',
        CONCAT(coalesce(first_name, ''), ' ', coalesce(last_name, ''))
       ,`company_name`) as name
FROM `{$this->table}`
WHERE `unique_id` = ?
LIMIT 1

【讨论】:

    【解决方案3】:

    我建议这样写:

    select (case when display_as = 'individual' 
                 then concat_ws(' ', first_name, last_name)
                 else company_name
            end) as name 
    from `{$this->table}` 
    where unique_id = ?
    limit 1;  -- probably not needed
    

    注意事项:

    • case 是条件逻辑的标准 SQL 构造。 if() 是定制的 MySQL 扩展。
    • concat_ws() 优雅地处理名称中的 NULL 值。它只是忽略该值而不是返回NULL
    • 并非所有地方都需要反引号。它们只是使查询更难编写和阅读。
    • 如果你的unique_id 真的很独特,你就不需要LIMIT 1

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2012-04-14
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2013-09-10
      相关资源
      最近更新 更多