如果我有一个简单的表,其中数据的行包含如下字符串:
/abc/123/gyh/tgf/345/6yh/5er
在SQL中,如何在第5和第6斜杠之间选择数据?我拥有的每一行都只是前斜线内的数据,我只想选择斜杠5和6之间的所有字符。
答案 0 :(得分:2)
CLR函数在处理字符串方面比T-SQL更有效。这里有一些信息可以帮助您开始编写CLR用户定义函数。
我认为您应该创建具有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)
答案 1 :(得分: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并不是为了做这种事情而设计的。
(编辑:我知道以下内容不适用于您的情况,但我会将其作为对其他读者的建议:)
事实上,关系数据库根本不适用于字符串分隔的值列表,因此更好的解决方案是将该字段拆分为表中的单独字段(或者分成子表,如果数量为条目各不相同)。
答案 2 :(得分:0)
也许...... SELECT FROM `table` WHERE `field` LIKE '%/345/%'