2017-08-02 52 views
1

我學習sqlite時遇到的新問題我遇到了subString函數,所以在我的練習中,我的表名是t1,列值是Partha000099我想增加1,例如,Partha000100當我嘗試與在sqlite中分割列值

SELECT SUBSTR(MAX(ID),6) FROM t1 

我得到輸出000099當我遞增1與下面的查詢

SELECT SUBSTR(MAX(ID),6)+1 FROM t1 

我得到的輸出爲100,現在的問題是如何構建回來,因爲我希望 我試着無線th下面的查詢,

SELECT 'Partha' || SUBSTR(MAX(ID),6)+1 FROM t1 

得到輸出爲1.請有人幫助我。

+0

爲什麼4,當'Partha'有六個字符? –

+0

對不起,我的錯誤它的6 – Parthasarathy

+0

如果你是新來的sqlite,我應該通知你,你應該避免這種密鑰。如果你想要一個自動遞增的數字,創建一個列,爲你做這個,然後將它與一個「組」或類似的(不管Partha的意思)在一個單獨的列中組合。 「select max(id)+ 1」獲得下一個id可能是sqlite中的「工作」解決方案,但是如果你後來轉向更多的併發數據庫,​​它將充滿了問題。 –

回答

1

儘管我的解決方案可行,但我會建議您針對這種類型的密鑰生成。 「SELECT MAX(ID)+1」產生下一個密鑰將會在更多的併發數據庫中充滿問題,並且您有可能在繁忙的應用程序/系統中產生重複密鑰。

將密鑰分成兩列,一組與名稱爲'Partha',另一列用自動遞增號碼更好。

但是,話雖如此,以下是如何生成下一個鍵如你的例子。

您需要:

  1. 拆分的關鍵分爲兩個
  2. 遞增數字部分
  3. 將其轉換回一個字符串
  4. 墊其6個位數

這裏的SQL會這樣做:

SELECT SUBSTR(ID, 1, 6) || SUBSTR('000000' || (SUBSTR(MAX(ID), 7)+1), -6) FROM t1; 

要將其墊到6個位數,我在前面加上6個零,然後抓住從得到的字符串中的最後6位數字與此類型的表達式

SUBSTR(x, -6) 

爲什麼會得到1的原因是,你的表達類似分組這樣的:

SELECT .... + 1 

而且....一部分,你的字符串連接,然後未遂轉換爲數字,其結果爲0,因此0 + 1給出了1

要獲得聯合國填補的結果,你可能已經只是增加了一些括號:

SELECT 'Partha' || (SUBSTR(MAX(ID),6)+1) FROM t1 
       ^    ^

然而,這也將是錯誤的,因爲它會返回Partha1,這是因爲SUBSTR(..., 6)抓住6個字符,並開始和第6個字符是最後aPartha,因此要獲得Partha100你需要這樣的:

SELECT 'Partha' || (SUBSTR(MAX(ID),7)+1) FROM t1 
           ^
+0

您也可以使用[printf()](http://www.sqlite.org/lang_corefunc.html#printf)。 –