如果我有一個簡單的表,其中的數據是這樣的行包含下面的字符串:SQL - 一個字符串選擇部分
/abc/123/gyh/tgf/345/6yh/5er
在SQL中,我該怎麼選擇出來的第5和第6之間的數據削減?每一行我是前斜線內簡單的數據,我只需要選擇斜線5和6
如果我有一個簡單的表,其中的數據是這樣的行包含下面的字符串:SQL - 一個字符串選擇部分
/abc/123/gyh/tgf/345/6yh/5er
在SQL中,我該怎麼選擇出來的第5和第6之間的數據削減?每一行我是前斜線內簡單的數據,我只需要選擇斜線5和6
CLR函數比T-SQL更有效地處理字符串。這裏有一些信息讓你開始編寫一個CLR用戶定義的函數。
我想你應該創建一個具有3個參數的函數:
然後拆分的分隔符(到一個數組)。然後在陣列(索引4)
下面是一個T-SQL的解決方案返回第五項,但我真的相信,一個CLR的解決方案會更好。
DECLARE @RRR varchar(500)
SELECT @RRR = '/abc/123/gyh/tgf/345/6yh/5er'
DECLARE
@index INT,
@INSTANCES INT
SELECT
@index = 1,
@INSTANCES = 5
WHILE (@INSTANCES > 1) BEGIN
SELECT @index = CHARINDEX('/', @RRR, @index + 1)
SET @INSTANCES = @INSTANCES - 1
END
SELECT SUBSTRING(@RRR, @index + 1, CHARINDEX('/', @RRR, @index + 1) - @index - 1)
SELECT SUBSTRING(myfield,
/* 5-th slash */
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
+ 1,
/* 6-th slash */
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield) + 1) + 1) + 1) + 1) + 1)
-
/* 5-th slash again */
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield,
CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
- 1)
FROM myTable
WHERE ...
這將工作,但它遠非優雅。如果可能的話,選擇完整的字段並在客戶端過濾掉所需的值(使用比T-SQL更強大的編程語言)。正如你所看到的,T-SQL不是爲了做這種事情而設計的。
(編輯:我知道下面並不適用於您的情況,但我會保持它作爲提醒的話給別人誰讀這:)
事實上,關係數據庫沒有被設計成完全可以使用字符串分隔的值列表,因此更好的解決方案是將該字段拆分爲表格中的單獨字段(或者如果條目數量不同,則將其分割爲不同的字段)。
您使用的數據庫是? – Jeff 2010-02-25 23:32:57
的SQL Server 2005 – Ode 2010-02-25 23:39:52
如果可能的話,你可能要重新考慮你的數據庫設計,並使用單獨的字段爲您的數據單位,而不是字符串分隔符。 – Heinzi 2010-02-25 23:41:02