2010-02-25 83 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不是为了做这种事情而设计的。

(编辑:我知道下面并不适用于您的情况,但我会保持它作为提醒的话给别人谁读这:)

事实上,关系数据库没有被设计成完全可以使用字符串分隔的值列表,因此更好的解决方案是将该字段拆分为表格中的单独字段(或者如果条目数量不同,则将其分割为不同的字段)。