次の表があるとします。
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?
上記の例では、name
に対してLorem 1
を取得し、description
に対してReally Nice widget. Buy it now!
を取得する必要があります。
これはどう?
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
:現在の言語IDname
および/またはdescription
の値がnullになる可能性がありますlanguage_id
= 2つのアイテムが存在できませんでした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
を含みません。
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行が存在するが、name/descrがnullである可能性があることを前提としています。
編集2。
最近誰かが同じような質問をしたのを思い出しました。そして、それがあなたであることを発見しました。あなたは翻訳から製品を分離する必要があります。それが、このクエリを書きにくくしている理由です。 トーマスの答え あなたがやりたいことを簡単に行うことができます。
仮定:language = 1
の各製品のエントリがあります。以下のコードは、必要なものを取得するための単純なSQLです。
もう1つのトピックは、要求した動作が必要かどうかです。name
とdescription
の間で言語を混在させることができるためです。私はそれを別の方法で設計します。2つのフィールドの1つが空の場合、デフォルトでメイン言語(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
SQLUpdateでの使用例を次に示します。
OracleのNVLと同等です。パラメータを使用して、プリペアドステートメントで以下のように使用できます
UPDATE
tbl_cccustomerinfo
SET
customerAddress = COALESCE(?,customerAddress),
customerName = COALESCE(?,customerName),
description = COALESCE(?,description)
WHERE
contactNumber=?