获取SQL Server中某些字符之前和之后的所有内容

时间:2012-06-13 07:55:13

标签: sql sql-server

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

images/test.jpg

我想修改条目,以便得到:test

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

我该如何解决?

16 个答案:

答案 0 :(得分:42)

如果您想使用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);

答案 1 :(得分:29)

使用以下功能

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

答案 2 :(得分:18)

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

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

答案 3 :(得分:5)

 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

答案 4 :(得分:2)

我刚刚在我的一份报告中做到了这一点,非常简单。

试试这个:

= MID(字段!。价值,8,4)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

所以:

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))
       )

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

以下查询为您提供' - '之前的数据 Ex-W12345A-4S

SELECT SUBSTRING(Column_Name,0,CHARINDEX(' - ',Column_Name))为'new_name' 来自[abc]。

输出 - W12345A

答案 9 :(得分: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

答案 10 :(得分:0)

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

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

-在/包括/

之后选择字符

选择SUBSTRING('abcde / wxyz',CHARINDEX('/','abcde / wxyz'),LEN('abcde / wxyz'))

答案 11 :(得分:0)

您可以尝试以下方法:

const openvpnmanager = require('node-openvpn');

const opts = {
  host: '147.0.40.145',
  port: 38473,
  timeout: 1500, //timeout for connection - optional, will default to 1500ms if undefined
  logpath: 'log.txt' //optional write openvpn console output to file, can be relative path or absolute
};
const auth = {
  user: '{{add user name}}',
  pass: '9c359ad1ebeec200',
};
const openvpn = openvpnmanager.connect(opts)


 openvpn.on('connected', () => {
   console.log("Connected to VPN successfully...");
 });

答案 12 :(得分:0)

Josien的启发,我想知道这种简化。

这还行吗?更短:

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

(由于公司SQL Server的正确问题,我目前无法测试,这本身就是一个问题)

答案 13 :(得分: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

答案 14 :(得分: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

答案 15 :(得分:0)

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

我们可以使用以下查询:

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