1

我有类似数据的表格:

Col1 ; Col2;
G11  ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;

我想用简单的 G11 col2 更新 G11- rows col2 ,但不修改 G12 rows ,因为没有简单的 G12 行。

4

3 回答 3

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 ;

SQL-Fiddle中测试


此查询将向您显示预期的编辑,而不更新任何内容:

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, '-%') ;
于 2013-01-04T10:06:46.260 回答
2

感谢 @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
于 2013-01-04T10:59:56.700 回答
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

但我喜欢 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 :)

于 2013-01-04T12:06:00.137 回答