2010-02-25 118 views
2

如果我有一個簡單的表,其中的數據是這樣的行包含下面的字符串:SQL - 一個字符串選擇部分

/abc/123/gyh/tgf/345/6yh/5er 

在SQL中,我該怎麼選擇出來的第5和第6之間的數據削減?每一行我是前斜線內簡單的數據,我只需要選擇斜線5和6

+0

您使用的數據庫是? – Jeff 2010-02-25 23:32:57

+0

的SQL Server 2005 – Ode 2010-02-25 23:39:52

+0

如果可能的話,你可能要重新考慮你的數據庫設計,並使用單獨的字段爲您的數據單位,而不是字符串分隔符。 – Heinzi 2010-02-25 23:41:02

回答

2

CLR函數比T-SQL更有效地處理字符串。這裏有一些信息讓你開始編寫一個CLR用戶定義的函數。

我想你應該創建一個具有3個參數的函數:

  1. 您正在搜索
  2. 分隔符(在你的情況下,值: /)
  3. 您正在使用的實例尋找(你的情況:5)

然後拆分的分隔符(到一個數組)。然後在陣列(索引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) 
0

也許之間的所有字符... SELECT FROM `table` WHERE `field` LIKE '%/345/%'

+0

這將選擇包含345的集合,但他想要解析出數據,我想。 – 2010-02-25 23:31:42

+0

是啊,這是行不通的,因爲它不會永遠是345.我想獲得第五和第六斜線之間的任何東西,不管裏面有什麼了。 – Ode 2010-02-25 23:39:12

+0

那好吧,選擇LIKE '/%/%/%/%/%/%/%' 和使用服務器端腳本來就分手了?的xD – casraf 2010-02-25 23:44:43

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不是爲了做這種事情而設計的。

(編輯:我知道下面並不適用於您的情況,但我會保持它作爲提醒的話給別人誰讀這:)

事實上,關係數據庫沒有被設計成完全可以使用字符串分隔的值列表,因此更好的解決方案是將該字段拆分爲表格中的單獨字段(或者如果條目數量不同,則將其分割爲不同的字段)。