获取 SQLServer 中某个字符之后和之前的所有内容

我的数据库里有以下条目:

images/test.jpg

我想修剪条目,所以我得到: test

所以基本上,我想要 /之后和 .之前的所有东西

我该怎么解决呢?

602171 次浏览

如果您希望使用 SQL 来解决这个问题,那么可以看看以下函数: SUBSTRINGCHARINDEX。你可以用这些来修剪你的条目。

可能的查询如下所示(其中 col是包含图像目录的列的名称:

SELECT SUBSTRING(col, LEN(SUBSTRING(col, 0, LEN(col) - CHARINDEX ('/', col))) + 1,
LEN(col) - LEN(SUBSTRING(col, 0, LEN(col) - CHARINDEX ('/', col))) - LEN(SUBSTRING(
col, CHARINDEX ('.', col), LEN(col))));

有点丑陋,它还取决于“ dir/name.ext”的标准格式。

编辑:
这一个(灵感来自 Praveen)更通用,处理不同长度的延伸:

SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX ('/', col))) + 1, LEN(col) - LEN(LEFT(col,
CHARINDEX ('/', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('.', col))) - 1);
 declare @T table
(
Col varchar(20)
)






insert into @T
Select 'images/test1.jpg'
union all
Select 'images/test2.png'
union all
Select 'images/test3.jpg'
union all
Select 'images/test4.jpeg'
union all
Select 'images/test5.jpeg'


Select substring( LEFT(Col,charindex('.',Col)-1),charindex('/',Col)+1,len(LEFT(Col,charindex('.',Col)-1))-1 )
from @T

使用以下函数

left(@test, charindex('/', @test) - 1)

我只是在我的一份报告中做了这个,它非常简单。

试试这个:

=MID(Fields!.Value,8,4)

注意: 这对我很有用,因为我尝试得到的值是一个常数,而不确定你尝试得到的也是一个常数。

我提出了一个更为普遍的方法:

所以:

DECLARE @a NVARCHAR(MAX)='images/test.jpg';




--Touch here
DECLARE @keysValueToSearch NVARCHAR(4000) = '/'
DECLARE @untilThisCharAppears NVARCHAR(4000) = '.'
DECLARE @keysValueToSearchPattern NVARCHAR(4000) = '%' + @keysValueToSearch + '%'




--Nothing to touch here
SELECT SUBSTRING(
@a,
PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch),
CHARINDEX(
@untilThisCharAppears,
@a,
PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch)
) -(PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch))
)

之前

SELECT SUBSTRING(ParentBGBU,0,CHARINDEX('/',ParentBGBU,0)) FROM dbo.tblHCMMaster;

之后

SELECT SUBSTRING(ParentBGBU,CHARINDEX('-',ParentBGBU)+1,LEN(ParentBGBU)) FROM dbo.tblHCMMaster

我知道这已经有一段时间. . 但这里有一个想法

declare @test varchar(25) = 'images/test.jpg'


select
@test as column_name
, parsename(replace(@test,'/','.'),1) as jpg
,parsename(replace(@test,'/','.'),2) as test
,parsename(replace(@test,'/','.'),3) as images

下面的查询在“-”之前为您提供数据 前 W12345A-4S

SELECT SUBSTRING(Column_Name,0, CHARINDEX('-',Column_Name))  as 'new_name'
from [abc].

输出-W12345A

我发现 罗伊 · 纳米尔的答案很有用,但是我扩展了它来创建它作为一个函数。我将变量重命名为对我有意义的变量,但是如果需要的话,您可以很容易地将它们翻译回来。

此外,Royi 的答案中的代码已经处理了被搜索的字符不存在的情况(从字符串的开头开始) ,但我还想处理被搜索的字符不存在的情况。

在这种情况下,它以类似的方式执行操作,从字符开始搜索,并将其余字符返回到字符串的末尾。

CREATE FUNCTION [dbo].[getValueBetweenTwoStrings](@inputString
NVARCHAR(4000), @stringToSearchFrom NVARCHAR(4000), @stringToSearchTo
NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @retVal NVARCHAR(4000)
DECLARE @stringToSearchFromSearchPattern NVARCHAR(4000) = '%' +
@stringToSearchFrom + '%'


SELECT @retVal = SUBSTRING (
@inputString,
PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom),
(CASE
CHARINDEX(
@stringToSearchTo,
@inputString,
PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
WHEN
0
THEN
LEN(@inputString) + 1
ELSE
CHARINDEX(
@stringToSearchTo,
@inputString,
PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
END) - (PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
)
RETURN @retVal
END

用法:

SELECT dbo.getValueBetweenTwoStrings('images/test.jpg','/','.') AS MyResult

——在/include/之前选择字符

select SUBSTRING ('abcde/wxyz',0,CHARINDEX('/','abcde/wxyz')+1)

——在/include/之后选择字符

select SUBSTRING('abcde/wxyz',CHARINDEX('/','abcde/wxyz'),LEN('abcde/wxyz'))

你可以试试这个:

Declare @test varchar(100)='images/test.jpg'
Select REPLACE(RIGHT(@test,charindex('/',reverse(@test))-1),'.jpg','')

受到 Josien工作的启发,我想简化一下。

这样也行吗? 简短得多:

SELECT SUBSTRING(col, CHARINDEX ('/', col) + 1, CHARINDEX ('.', col) - CHARINDEX ('/', col) - 1);

(我现在无法测试,因为我公司的 SQL 服务器出现了正确的问题,这本身就是一个问题)

只要试试左,右,CHARINDEX

select
LEFT((RIGHT(a.name,((CHARINDEX('/', name))+1))),((CHARINDEX('.', (RIGHT(a.name,
((CHARINDEX('/', name))+1)))))-1)) splitstring,
a.name
from
(select 'images/test.jpg' as name)a

我得到了一些无效的长度错误。所以我做了这个函数,它不会给出任何长度问题。另外,当您没有找到搜索的文本时,它将返回一个 NULL。

CREATE FUNCTION [FN].[SearchTextGetBetweenStartAndStop](@string varchar(max),@SearchStringToStart varchar(max),@SearchStringToStop varchar(max))


RETURNS varchar(max)


BEGIN




SET @string =    CASE
WHEN CHARINDEX(@SearchStringToStart,@string) = 0
OR CHARINDEX(@SearchStringToStop,RIGHT(@string,LEN(@string) - CHARINDEX(@SearchStringToStart,@string) + 1 - LEN(@SearchStringToStart))) = 0
THEN NULL
ELSE SUBSTRING(@string
,CHARINDEX(@SearchStringToStart,@string) + LEN(@SearchStringToStart) + 1
,(CHARINDEX(@SearchStringToStop,RIGHT(@string,LEN(@string) - CHARINDEX(@SearchStringToStart,@string) + 1 - LEN(@SearchStringToStart)))-2)
)
END




RETURN @string


END
SELECT Substring('ravi1234@gmail.com', 1, ( Charindex('@', 'ravi1234@gmail.com')
- 1 ))
Before,
RIGHT('ravi123@gmail.com', ( Charindex('@', 'ravi123@gmail.com') + 1 ))
After

如果输入 = pg102a-wlc01s.png.intel.com 和输出应为 pg102a-wlc01

我们可以使用以下查询:

select Substring(pc.name,0,charindex('.',pc.name,0)),pc.name from tbl_name pc
declare @searchStart nvarchar(100) = 'search ';
declare @searchEnd nvarchar(100) = ' ';
declare @string nvarchar(4000) = 'This is a string to search (hello) in this text ';


declare @startIndex int = CHARINDEX(@searchStart, @string,0) + LEN(@searchStart);
declare @endIndex int = CHARINDEX(@searchEnd, @string, @startIndex + 1);
declare @length int = @endIndex - @startIndex;
declare @sub nvarchar(4000) = SUBSTRING(@string, @startIndex, @length)


select @startIndex, @endIndex, @length, @sub

这比这个答案中专门回答这个问题的一行代码要清晰一些,但不是以一种对所有读者都有好处的通用方式。只需稍加修改,就可以很容易地将其转换为一个函数。

如果有一个以上或者没有给定的字符出现,使用以下命令:

DECLARE @rightidx int = CASE
WHEN 'images/images/test.jpg' IS NULL OR (CHARINDEX('.', 'images/images/test.jpg')) <= 0 THEN LEN('images/images/test.jpg')
ELSE  (CHARINDEX('.', REVERSE('images/images/test.jpg')) - 1)
END


SELECT RIGHT('images/images/test.jpg', @rightidx)

我就是这么做的。

    CREATE FUNCTION dbo.get_text_before_char(@my_string nvarchar(255),@my_char char(1))
RETURNS nvarchar(255)
AS
BEGIN;
return IIF(@my_string LIKE '%' + @my_char + '%',left  (@my_string, IIF(charindex(@my_char, @my_string) - 1<1,1,charindex(@my_char, @my_string) - 1)),'');
END;
    

CREATE FUNCTION dbo.get_text_after_char(@my_string nvarchar(255),@my_char char(1))
RETURNS nvarchar(255)
AS
BEGIN;
return IIF ( @my_string LIKE '%' + @my_char + '%' ,RIGHT ( @my_string , IIF ( charindex ( @my_char ,reverse(@my_string) )-1 < 1 ,1 ,charindex ( @my_char ,reverse(@my_string) )-1 ) ) , '' )
END;
    

SELECT
dbo.get_text_before_char('foo-bar','-')
, dbo.get_text_after_char('foo-bar','-')
declare @test varchar(100)='images/test.jpg'
select right(left(@test, charindex('.', @test) - 1),4)