9

次の表があるとします。

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

nameand descriptionwhere = 2を取得しようとするが、列にNULLが含まれている場合は= 1language_idにフォールバックするように、これをクエリするにはどうすればよいですか?language_id

上記の例では、Lorem 1fornameReally nice widget. Buy it now!forを取得する必要がありdescriptionます。

4

5 に答える 5

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および/またはの値はdescriptionnullになる可能性があります
  • language_id=2つのアイテムが存在できませんでした
于 2011-04-10T09:06:16.590 に答える
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

于 2011-04-09T23:59:07.320 に答える
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行が存在するが、name/descrがnullである可能性があることを前提としています。

編集2.
最近誰かが同様の質問をしたことを思い出しました。そして、私はそれがあなたであることに気づきました。製品を翻訳から分離する必要があります。これが、このクエリの記述を困難にしている理由です。トーマスの答えはあなたがやりたいことをするのを簡単にします。

于 2011-04-09T23:59:17.147 に答える
0

仮定:各製品のエントリがありlanguage = 1 ます。以下のコードは、必要なものを取得するための単純なSQLです。

もう1つのトピックは、要求した動作が必要かどうかです。との間nameで言語を混在させることができるためですdescription。別の方法で設計します。2つのフィールドのいずれかが空の場合、デフォルトでメイン言語(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
于 2013-02-02T09:02:49.650 に答える
0

SQLUpdateでの使用例を次に示します。

OracleのNVLと同等です。パラメータを使用して、プリペアドステートメントで以下のように使用できます

UPDATE
    tbl_cccustomerinfo
SET
    customerAddress = COALESCE(?,customerAddress),
    customerName =  COALESCE(?,customerName),
    description =  COALESCE(?,description)
WHERE
    contactNumber=?
于 2013-09-29T20:06:03.560 に答える