【发布时间】:2023-03-11 13:46:01
【问题描述】:
使用 SQL 我想返回列中第三个正斜杠之前的所有文本
所以
/one/two/three/whatever/testing
会返回:
/one/two/three
在 SQL(特别是 MS SQL 2005+ 下的 MS T-SQL)中有任何快速而肮脏的方法吗?
【问题讨论】:
标签: sql sql-server pattern-matching substring
使用 SQL 我想返回列中第三个正斜杠之前的所有文本
所以
/one/two/three/whatever/testing
会返回:
/one/two/three
在 SQL(特别是 MS SQL 2005+ 下的 MS T-SQL)中有任何快速而肮脏的方法吗?
【问题讨论】:
标签: sql sql-server pattern-matching substring
既然你说“又快又脏”,我假设这个非常快速和非常脏的解决方案不会收到一堆反对票。下面的 SQL 使用多个 SUBSTRING() 函数来查找第三个斜线:
DECLARE @str VARCHAR(50)
SET @str = '/one/two/three/whatever/testing'
SELECT SUBSTRING(@str, 0, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, 0) + 1) + 1) + 1))
您可以看到一个工作示例here。
【讨论】:
尝试添加功能
/*
Example:
SELECT dbo.CHARINDEX2('a', 'abbabba', 3)
returns the location of the third occurrence of 'a'
which is 7
*/
CREATE FUNCTION CHARINDEX2
(
@TargetStr varchar(8000),
@SearchedStr varchar(8000),
@Occurrence int
)
RETURNS int
AS
BEGIN
DECLARE @pos INT, @counter INT, @ret INT
set @pos = CHARINDEX(@TargetStr, @SearchedStr)
set @counter = 1
if @Occurrence = 1 set @ret = @pos
else
begin
while (@counter < @Occurrence)
begin
select @ret = CHARINDEX(@TargetStr, @SearchedStr, @pos + 1)
set @counter = @counter + 1
set @pos = @ret
end
end
RETURN(@ret)
end
然后这样引用函数...
SELECT SUBSTRING('/one/two/three/whatever/testing', 0, dbo.CHARINDEX2('/', '/one/two/three/whatever/testing', 3))
查看文章here 以获得更好的外观:)
【讨论】:
CREATE FUNCTION dbo.CharIndex2 (@expressionToFind VARCHAR(MAX), @expressionToSearch VARCHAR(MAX), @instance INT)
RETURNS INT
BEGIN
DECLARE @Position INT
DECLARE @i INT = 1
WHILE @i <= @instance
BEGIN
SET @Position = CHARINDEX(@expressionToFind,@expressionToSearch,COALESCE(@Position+1,1))
SET @i += 1
END
RETURN @Position
END
GO
【讨论】: