質問
テーブルを更新するために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構文エラーを回避するために準備クエリを使用します。