2009-08-27 75 views
0

我有一個字段在table.Suppose它的值是2009/1234.我想在'/'之前獲得數字我想在存儲過程中做這個sql.Can任何人都可以幫助?獲取數字後/存儲過程

+0

標題說的是一套,而queston另一... – Guffa 2009-08-27 07:30:24

回答

1

SUBSTRING(myvalue的,CHARINDEX( '/',myvalue的)+ 1,8000)

2

假設你可以保證斜線和數字會存在:

SELECT SUBSTRING(myfield, CHARINDEX('/', myfield)+1, 1000) FROM mytable; 
+0

如何讓之前「/」數字? – user42348 2009-08-27 06:58:44

2

正確方式要做到這一點(在我看來,當然,因爲「正確」是一個主觀術語)將是修改模式,使這些值分開。

換句話說,2009年和1234年將在不同的列。

在速度和可伸縮性方面,在選擇語句中使用每行函數幾乎總是一個壞主意。這是因爲DBMS必須在上執行計算,每提取一行單行,每提取一次時間。

如果你需要他們保持作爲一個單一的專欄中,我已經在過去使用的一個技巧是使用插入/更新觸發器有兩個額外的列接收部分,所以你會:

SomeFields  | Data | PostSlash 
-----------------+-----------+---------- 
blah, blah, blah | 2009/1234 | 1234 

是的,我知道這不是理想的3NF,但如果你做得對,那麼出於性能原因打破它是完全可以接受的。觸發器將保證列始終匹配,並且您會發現查詢以最少的觸發和數據重複開銷運行得更快。

但是最好在創建或更新行時進行一次拆分,而不是每次讀取它時都進行拆分。這是因爲數據庫通常比他們寫的更多。觸發費用在所有選擇上攤銷。請記住,如果您的表格較小或(出於一些奇怪的原因)書寫比讀取更頻繁,那麼使用每行功能可能會更好。

+0

很高興看到看起來超出問題的人。是的,可以直接回答這個問題,但有時候,更多地考慮這個問題會揭示出潛在的合適的解決方案。 – belugabob 2009-08-27 07:00:11

1

爲了斜線前得到的數字,假設斜線總是存在:

SELECT LEFT(columnname, CHARINDEX('/', columnname, 1) - 1) FROM aTable