68

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

images/test.jpg

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

/所以基本上,我想要之前和之后的一切.

我该如何解决?

4

17 回答 17

73

使用以下功能

left(@test, charindex('/', @test) - 1)
于 2014-05-31T08:20:56.973 回答
68

如果您想使用 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);
于 2012-06-13T08:01:24.007 回答
31

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

SELECT SUBSTRING(ParentBGBU,CHARINDEX('-',ParentBGBU)+1,LEN(ParentBGBU)) FROM dbo.tblHCMMaster
于 2017-01-04T13:13:57.767 回答
9

----选择/之前的字符,包括/

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

--选择/之后的字符,包括/

select SUBSTRING('abcde/wxyz',CHARINDEX('/','abcde/wxyz'),LEN('abcde/wxyz')) 
于 2019-01-08T11:33:24.990 回答
6
 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
于 2012-06-13T08:38:04.717 回答
3

我做了一个更通用的方法:

所以 :

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))
       )
于 2016-09-03T07:58:38.760 回答
2

我只是在我的一份报告中做到了这一点,而且非常简单。

试试这个:

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

注意:这对我有用,因为我试图获得的值是一个常数,不确定你想要获得的值也是一个常数。

于 2015-04-28T14:18:53.970 回答
2

SELECT SUBSTRING('ravi1234@gmail.com',1,(CHARINDEX('@','ravi1234@gmail.com')-1)) 之前,RIGHT('ravi123@gmail.com',(CHARINDEX('@' ,'ravi123@gmail.com')+1)) 之后

于 2020-08-20T05:38:07.687 回答
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
于 2017-07-26T04:17:43.897 回答
0

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

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

输出 - W12345A

于 2017-08-20T11:21:15.817 回答
0

我发现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
于 2018-04-19T18:50:07.413 回答
0

你可以试试这个:

Declare @test varchar(100)='images/test.jpg'
Select REPLACE(RIGHT(@test,charindex('/',reverse(@test))-1),'.jpg','')
于 2019-04-03T13:08:59.020 回答
0

受到Josien工作的启发,我想知道是否可以简化。

这也行吗?矮得多:

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

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

于 2019-11-07T15:49:20.483 回答
0

只需尝试使用 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
于 2020-02-04T10:56:45.853 回答
0

我得到了一些无效的长度错误。所以我做了这个功能,这不应该给任何长度问题。此外,当您没有找到搜索到的文本时,它将返回 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
于 2020-05-26T08:05:35.107 回答
0

如果 Input= pg102a-wlc01s.png.intel.com 并且输出应该是 pg102a-wlc01s

我们可以使用以下查询:

select Substring(pc.name,0,charindex('.',pc.name,0)),pc.name from tbl_name pc

于 2021-02-12T05:54:36.000 回答
0
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

这比这个答案中专门回答问题的单行字更清晰一些,但不是以一种有利于所有读者的通用方式。这也可以很容易地变成一个函数,只需稍作修改。

于 2022-02-14T18:41:14.230 回答