2009-12-07 19 views
10

フィールドx、y、zがid = xxのフィールドを更新する更新ステートメントがあります。更新フィールドがNULLでない場合

テーブルには、いくつかの異なるx_created_datetimeフィールドがあります(レコードの異なる部分には、異なる人によって維持/入力されています)。私はnullの場合はこのフィールドを更新する単一のクエリを記述したいと思いますが、nullでない場合はそれを残してください。

それでは、私が持っていることは次のとおりです。

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
WHERE id = X 

私は必要なものを以下に追加する方法ですが、それでも常に上記を更新:

scan_created_date = "current_unix_timestamp" 
where scan_created_date is null 

私は私が行うことができます願っていますこれは、DBへの2番目のトランザクションなし。どのようにこれを達成するための任意のアイデア?

UPDATE newspapers 
SET scan_notes = "data",  
    scan_entered_by = "some_name",  
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
WHERE id = X 

COALESCE関数は最初の非null値を選ぶ:

答えて

28

はこれを行います。この場合、datestamp scan_created_dateが同じ値に更新されます。存在しない場合は、"current_unix_timestamp"を置き換えます。

+3

を使用して準備された文の中で以下のようにそれを使用することができ :COALESCEは、値のリストに最初の非null値を返すので、scan_created_dateがすでにある場合それは既にそこにある値に設定されます。 nullの場合は、現在のタイムスタンプに設定されます。 –

+0

nullの場合、これはscan_created_dateを更新しませんか?彼はそれがヌルでないところでそれを更新したいと思うように見えます。 – tloach

+0

@tloach - 説明を参照してください。 @ JacobM - すでにそれをやっていた:) – cjk

1

あなたはCOALESCE()ウィッヒを使用することができますが)最初の非NULL値を返します。

scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
4

私は、あなたが探していることはIF()

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = IF(scan_created_date IS NOT NULL, "current_unix_timestamp", NULL) 
WHERE id = X 
3

MySQLがIFNULL機能を持っていると思いますですので、あなたはできる:

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
    scan_created_date = IFNULL(scan_created_date, "current_unix_timestamp") 
WHERE id = X 
1

UPDATE newspapers a, newspapers b 
SET a.scan_notes = "data",  
    a.scan_entered_by = "some_name",  
    a.scan_modified_date = "current_unix_timestamp", 
    b.scan_created_date = "current_unix_timestamp" 
WHERE a.id = X AND b.id = X AND b.scan_created_date is not NULL 
0

これは、OracleのNVLと同等です。あなたはそれがこの作業の理由を簡単に説明する価値があるパラメータ

UPDATE 
    tbl_cccustomerinfo 
SET 
    customerAddress = COALESCE(?,customerAddress), 
    customerName = COALESCE(?,customerName), 
    description = COALESCE(?,description) 
WHERE 
    contactNumber=? 
関連する問題