我的数据库中有以下条目:
images/test.jpg
我想修剪条目,所以我得到:test
/
所以基本上,我想要之前和之后的一切.
我该如何解决?
使用以下功能
left(@test, charindex('/', @test) - 1)
如果您想使用 SQL 将其从表中删除,请查看以下对您有帮助的函数:SUBSTRING
和CHARINDEX
. 您可以使用它们来修剪您的条目。
可能的查询将如下所示(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);
前
SELECT SUBSTRING(ParentBGBU,0,CHARINDEX('/',ParentBGBU,0)) FROM dbo.tblHCMMaster;
后
SELECT SUBSTRING(ParentBGBU,CHARINDEX('-',ParentBGBU)+1,LEN(ParentBGBU)) FROM dbo.tblHCMMaster
----选择/之前的字符,包括/
select SUBSTRING ('abcde/wxyz',0,CHARINDEX('/','abcde/wxyz')+1)
--选择/之后的字符,包括/
select SUBSTRING('abcde/wxyz',CHARINDEX('/','abcde/wxyz'),LEN('abcde/wxyz'))
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
我做了一个更通用的方法:
所以 :
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))
)
我只是在我的一份报告中做到了这一点,而且非常简单。
试试这个:
=MID(Fields!.Value,8,4)
注意:这对我有用,因为我试图获得的值是一个常数,不确定你想要获得的值也是一个常数。
SELECT SUBSTRING('ravi1234@gmail.com',1,(CHARINDEX('@','ravi1234@gmail.com')-1)) 之前,RIGHT('ravi123@gmail.com',(CHARINDEX('@' ,'ravi123@gmail.com')+1)) 之后
我知道这已经有一段时间了..但这是一个想法
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 Namir的答案很有用,但对其进行了扩展以将其创建为一个函数。我将变量重命名为对我有意义的变量,但如果需要,您可以很容易地将它们翻译回来。
此外,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
你可以试试这个:
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 服务器的正确问题,我现在无法测试,这本身就是一个问题)
只需尝试使用 LEFT ,RIGHT ,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
如果 Input= pg102a-wlc01s.png.intel.com 并且输出应该是 pg102a-wlc01s
我们可以使用以下查询:
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
这比这个答案中专门回答问题的单行字更清晰一些,但不是以一种有利于所有读者的通用方式。这也可以很容易地变成一个函数,只需稍作修改。