私は同様のデータを持つテーブルを持っています:
Col1 ; Col2;
G11 ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;
G11-rows col2 を単純な G11 col2 で更新したいのですが、単純な G12 行がない場合は G12 rows を変更したくありません。
私は同様のデータを持つテーブルを持っています:
Col1 ; Col2;
G11 ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;
G11-rows col2 を単純な G11 col2 で更新したいのですが、単純な G12 行がない場合は G12 rows を変更したくありません。
UPDATE
tableX AS upd
JOIN
tableX AS simple
ON simple.Col1 NOT LIKE '%-%'
AND upd.Col1 LIKE CONCAT(simple.Col1, '-%')
SET
upd.Col2 = simple.Col2 ;
SQLフィドルでテスト済み
このクエリは、何も更新せずに意図した編集を表示します。
SELECT upd.Col1, upd.Col2,
simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM
tableX AS upd
JOIN
tableX AS simple
ON simple.Col1 NOT LIKE '%-%'
AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;
sqlfidle を作成した @Ypercube の功績。を使用して検証を行う別の方法を次に示しinstr
ます。少し速いようです。
選択クエリのみ。更新クエリにもinstr
構文を含めることができます。
SELECT *
FROM tableX ;
SELECT upd.Col1, upd.Col2,
simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM
tableX AS upd
JOIN
tableX AS simple
ON instr(simple.Col1 ,'-') = 0
AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;
結果:
COL1 COL2 SIMPLECOL1 NEW_VALUE
G11-1 0 G11 112
G11-2 2 G11 112
Ypercube のソリューションは正しくクリーンであり、bonCodigo のアイデアは素晴らしいです! しかし、どちらももう少し単純化できます。この条件が true を返す場合:
upd.Col1 LIKE CONCAT(simple.Col1, '-%')
upd.Col1
これは、に (少なくとも)-
よりも1 つ多く含まれていることを意味し、サンプル データのようにsimple.Col1
1 つだけ-
が許可されている場合は、まだ含まれsimple.Col1
ていない-
ため、これらの条件は両方とも冗長です。
ON simple.Col1 NOT LIKE '%-%'
ON instr(simple.Col1 ,'-') = 0
しかし、私は を使用するというアイデアが気に入っています。INSTR
常に を代用できるわけではありませんが、代用LIKE
できる場合は高速になります。SELECT クエリを次のように記述します。
SELECT
upd.Col1,
upd.Col2,
simple.Col1 AS simpleCol1,
simple.Col2 AS New_value
FROM
tableX AS upd JOIN tableX AS simple
ON instr(upd.Col1, concat(simple.Col1, '-'))
UPDATEクエリは非常に似ています。これは他の回答の統合にすぎないため、アイデアのために全員に+1を与えています:)