我的表格中有类似的数据:
Col1 ; Col2;
G11 ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;
我想用简单的G11 col2更新G11-行col2,但不修改G12行,其中没有简单的G12行。
答案 0 :(得分:3)
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 ;
中进行测试
此查询将显示预期的编辑内容,而不会更新任何内容:
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, '-%') ;
答案 1 :(得分:2)
感谢@Ypercube创建了sqlfidle。以下是使用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
答案 2 :(得分:0)
Ypercube的解决方案是正确和干净的,bonCodigo的想法很棒!但是它们都可以简化一点。如果此条件返回true:
upd.Col1 LIKE CONCAT(simple.Col1, '-%')
这意味着upd.Col1
确实包含({至少)-
个simple.Col1
多个-
,并且只允许一个simple.Col1
,例如您的示例数据,-
已经没有ON simple.Col1 NOT LIKE '%-%'
ON instr(simple.Col1 ,'-') = 0
,所以这两个条件都是多余的:
INSTR
但是我喜欢使用LIKE
的想法,它不能总是替换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, '-'))
,但是当它可以时,它可以更快。我会写这样的SELECT查询:
{{1}}
和UPDATE查询非常相似。由于这只是对其他答案的整合,我给每个人一个+1的想法:)