如果我有一个简单的表,其中的数据是这样的行包含下面的字符串: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