我有类似数据的表格:
Col1 ; Col2;
G11 ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;
我想用简单的 G11 col2 更新 G11- rows col2 ,但不修改 G12 rows ,因为没有简单的 G12 行。
我有类似数据的表格:
Col1 ; Col2;
G11 ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;
我想用简单的 G11 col2 更新 G11- rows col2 ,但不修改 G12 rows ,因为没有简单的 G12 行。
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, '-%') ;
感谢 @Ypercube 创建 sqlfile。这是另一种使用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
确实包含(至少)一个-
多于一个simple.Col1
,并且如果只-
允许一个,就像在您的示例数据中一样,simple.Col1
已经没有-
,所以这两个条件都是多余的:
ON simple.Col1 NOT LIKE '%-%'
ON instr(simple.Col1 ,'-') = 0
但我喜欢 using 的想法INSTR
,它不能总是替代 a 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 :)