質問

テーブルを更新するためにPHPでSQLクエリを作成しようとしています。 影響を受ける行ごとに異なる WHERE 句を使用することは可能ですか?

例:

UPDATE table 
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2

etc?

ご協力ありがとうございます。ありがとう

役に立ちましたか?

解決

SQLステートメントに対して複数のWHERE句を使用することはできませんが、CASEステートメントを使用して、実行しようとしていることを実行できます。もう1つのオプションは、複数のUPDATEステートメントを実行することです。

CASEステートメントを使用したサンプルは次のとおりです。

UPDATE table
SET val = (
    CASE someproperty
        WHEN 1 THEN X
        WHEN 2 THEN Y
        ELSE val
    END
);

複数のUPDATEステートメントを使用したサンプルを次に示します。

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

他のヒント

はい、CASEステートメントでできます。

UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

現在、1つの CASE ステートメントは、複数の UPDATE ステートメントに比べて読みにくいという懸念があります。ここには有効な引数があります。たとえば、1000行が更新されている場合、1つの CASE に対して1000の異なる条件を使用するよりも、複数の UPDATE ステートメントを使用する方が良いと感じています。

ただし、CASEステートメントの方が適切な場合があります。たとえば、テーブルのフィールド値の偶数または奇数の性質など、何らかの特性に基づいて行を更新する場合、 CASE ステートメントは、行内の行を更新するための素晴らしく簡潔で保守可能な方法です。特定のタイプのロジックをすべて共有する膨大な数の UPDATE ステートメントに頼る必要なくテーブルを作成できます。例:

UPDATE table
SET val = CASE MOD(someproperty, 2)  
           WHEN 0 THEN x 
           WHEN 1 THEN y
          END

この式は何らかのプロパティのモジュラスを取り、0(偶数)の場合は値xをvalに割り当て、1(奇数)の場合は値yをvalに割り当てます。このステートメントによって更新されるデータの量が多いほど、複数の UPDATE ステートメントによる更新と比較されます。

要するに、 CASE ステートメントは、 UPDATE ステートメントと同じくらい読み取り可能/保守可能です。それはすべて、あなたがそれらで何をしようとしているかに依存します。

編集:ELSE句を追加して安全性を高めました。 OPは特定の行のみを更新することに関心がある場合があるため、残りはUPDATEの前の状態のままにしておく必要があります。

編集 CASE ステートメントが複数の UPDATE ステートメントよりも効果的なアプローチであるシナリオを追加しました。

いいえ。 2つの更新を行います。

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

考え直して、サブクエリまたはcaseステートメントを使用できます...

UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )

次のようなサブクエリを作成する必要がある場合があります。

UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

コンパクトで簡単にスケーラブルな方法:

UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);

この方法でクエリを作成します:

$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";

文字列値を処理する場合は、SQL構文エラーを回避するために準備クエリを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top