说我有下表:
TABLE: product
===============================================================================
| product_id | language_id | name | description |
===============================================================================
| 1 | 1 | Widget 1 | Really nice widget. Buy it now! |
-------------------------------------------------------------------------------
| 1 | 2 | Lorem 1 | |
-------------------------------------------------------------------------------
如何对此进行查询,以便它尝试向我name
和description
language_id
= 2,但如果列为language_id
= 1包含NULL?
在上面的例子中,我应该Lorem 1
获得name
而Really nice widget. Buy it now!
获得description
。
答案 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=?