MySQL:如何使用COALESCE

时间:2011-04-09 23:53:29

标签: mysql coalesce

说我有下表:

TABLE: product
===============================================================================
| product_id | language_id | name           | description                     |
===============================================================================
| 1          | 1           | Widget 1       | Really nice widget. Buy it now! |
-------------------------------------------------------------------------------
| 1          | 2           | Lorem  1       |                                 |
-------------------------------------------------------------------------------

如何对此进行查询,以便它尝试向我namedescription language_id = 2,但如果列为language_id = 1包含NULL?

在上面的例子中,我应该Lorem 1获得nameReally nice widget. Buy it now!获得description

5 个答案:

答案 0 :(得分:8)

这个怎么样?

SET @pid := 1, @lid := 2;
SELECT 
    COALESCE(name,(
        SELECT name
        FROM product
        WHERE product_id = @pid AND description IS NOT NULL
        LIMIT 1
    )) name, 
    COALESCE(description,(
        SELECT description
        FROM product
        WHERE product_id = @pid AND description IS NOT NULL
        LIMIT 1
    )) description
FROM product
WHERE product_id = @pid 
    AND (language_id = @lid 
    OR language_id = 1)
ORDER BY language_id DESC
LIMIT 1;

其中:

  • @pid:当前产品ID
  • @lid:当前语言ID
  • name和/或description的值可以为null
  • language_id = 2项目不存在

答案 1 :(得分:1)

select name, description from product
where product_id = @pid
  and name is not null
  and description is not null
  and (language_id = @lang or language_id = 1)
order by language_id desc

其中@pid是当前的产品ID,而@lang是当前的语言ID。

返回的第一行将包含当前名称和描述。

这假设行language_id = 1在名称或描述中不包含NULL。

答案 2 :(得分:0)

select p2.product_id
      ,coalesce(p2.name, p1.name, 'No name') as name
      ,coalesce(p2.description, p1.description, 'No description') as description
  from product p2
  left join product p1 on(
       p1.product_id = p2.product_id
   and p1.language_id = 1
  )
 where p2.product_id  = 1
   and p2.language_id = 2;

<强> EDIT1:
上面的查询假定存在language = 2行,但名称/ descr可能为null。

编辑2。
我记得最近有人问过类似的问题。然后我发现它。您需要将产品与翻译分开。这就是使这个查询难以编写的原因。 Thomas answer可以轻松完成您想要的任务。

答案 3 :(得分:0)

假设:每种产品都有一个条目= 1的条目 下面的代码只是简单的sql来检索你想要的东西。

另一个主题是你想要你所要求的行为......因为你可以在'name'和'description'之间使用混合语言。我会以不同的方式设计它,如果两个字段中的一个为空,我将默认返回主语言(1)。

select p.product_id
      ,coalesce(pl.name, p.name, 'No name') as name
      ,coalesce(pl.description, p.description, 'No description') as description
  from product p
  left join product pl on ( pl.product_id = p.product_id and pl.language_id = :language_id)
  )
 where p.product_id  = :product_id and p.language_id = 1

答案 4 :(得分:0)

以下是使用SQL Update的示例:

它与Oracle的NVL相当。 您可以使用参数

在预准备语句中使用它,如下所示
UPDATE
    tbl_cccustomerinfo
SET
    customerAddress = COALESCE(?,customerAddress),
    customerName =  COALESCE(?,customerName),
    description =  COALESCE(?,description)
WHERE
    contactNumber=?