2011-10-03 51 views
1

为了简单起见,假设我有一个包含数字数据的列的SQL表。样本数据SQL Query用新行替换多个匹配行

11 
13 
21 
22 
23 
3 
31 
32 
33 
41 
42 
131 
132 
133 
141 
142 
143 

如果表中包含的形式X1,X2,X3的所有号码,但不是X(其中x是所有的号码的数字,但在最后一位。所以对于123456,X将是12345),那么我想用一个新的行x替换这三行。

上述数据所需的输出将是:

11 
13 
2 
3 
31 
32 
33 
41 
42 
131 
132 
133 
14 

我将如何做到这一点与SQL?我应该提到,我不想永久性地改变数据 - 仅用于查询结果。 谢谢。

+0

@Magnus是。要组合的数字需要大于10.感谢您指出了额外的限制。 –

+0

你使用的是什么rdbms?有些数据库提供有用的功能。 –

+0

@Jens Schauder postgres –

回答

2

我认为

  • 对功能的存在:lastDigithead生产的最后一位数字和输入值的分别其余

  • 的数据是唯一

  • 只有数字1,2,3是用于构建表中的值

  • 表被命名为t,有一列x

  • 你不想要这个递归工作

  • 创建一个视图n这样的:select head(x) h, lastDigit(x) last from t您可以使用内联的意见,而不是

  • 创建这样

    一个视图C

    用h 具有COUNT(*)= 3

请选择h 从n个 组然后这应该给所期望的结果:

select distinct x 
from (
    select x from t where head(x) not in (select h from c) 
    union 
    select h from c 
) 
+0

作品,谢谢!你的伪代码中的一个修正是'select h'应该是'select head' –

+0

修复它(反过来) –

+0

完整的解决方案将不得不递归或程序性(请参阅问题评论)。仍然+1的一个非常好的答案。 –

0

您需要两个SQL命令,一个用于删除现有行,另一个用于添加新行。他们是这样的(其中:X是包含在你的榜样你的基数,14参数):

DELETE FROM YourTable WHERE YourColumn BETWEEN (:X*10) AND ((:X*10) + 9) 

INSERT INTO YourTable (YourColumn) VALUES (:X) 

注:我假设你希望所有从X0到X9的数字被删除,所以这就是我上面写道。如果你真的只想要X1,X2,X3处移走,那么你可以使用这个DELETE语句来代替:

DELETE FROM YourTable WHERE YourColumn BETWEEN ((:X*10) + 1) AND ((:X*10) + 3) 
+0

您对值为0-9的假设是正确的。但是,在您的解决方案中,您可以删除范围之间的所有值,而不管范围是否已满(纠正我,如果我错了)。我不想用14替换一个不完整的范围,例如140,141,142,149。 –

+0

我不清楚需要全部范围匹配,我调整了我的问题。 –

+0

不,我完全错过了这个要求。这个列是否被声明为UNIQUE(即没有重复值)? –