2011-10-03 50 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(即沒有重複值)? –