未找到 last_name 值时查询不返回任何内容

Query not returning anything when no last_name value found

我刚刚构建了这个新的条件查询,用于根据 display_as 值提取 first_name AND last_name OR company_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 值,而 last_nameno value,则根本不会返回任何内容。

我该如何解决这个问题?

改为使用此查询。

$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";

试试这个:

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

我建议这样写:

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