如何在sql server 2008中对字符串进行子串?

时间:2014-12-29 08:26:29

标签: sql sql-server

我在SQL中有一个字符串,如

  

CMS / 00014456582 / 693362 / 004535 / JCR_110914_NEW_4535 CMS

我想以粗体显示一个字符串。
如何使用substring函数读取该字符串。

select SUBSTRING('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS',18,6) AS column_name

这是我的问题的一个答案。但是我希望在两个' /'之后阅读字符串。 - 文件分隔符。

我有另一个字符串,如 INF / 000079160100 / P - (34)案例净银行,我想读取(此)值.eg 34 提前谢谢。

5 个答案:

答案 0 :(得分:2)

DECLARE @Text NVARCHAR(1000)

select @Text = SUBSTRING('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS', CHARINDEX('/', 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS') + 1,1000) 

SELECT SUBSTRING(@Text, CHARINDEX('/', @Text) + 1,6) AS column_name

答案 1 :(得分:2)

获得所需内容的一种非常灵活的方法是使用recursive CTE。 CTE表达式基本上会给你所有' /'的位置和相应的索引。包含在字符串中:

DECLARE @string VARCHAR(MAX) = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'

;WITH CTE AS (
    SELECT CHARINDEX('/', @string) AS pos, idx = 1 

    UNION ALL

    SELECT CHARINDEX('/', @string, pos+1) AS pos, idx + 1 
    FROM CTE
    WHERE pos > 0
)
SELECT *
FROM CTE

产生

pos idx
-------
4   1
16  2
23  3
30  4
0   5

使用上面的CTE,您可以轻松提取第一和第二斜杠,第二和第三等中包含的字符串的 任何部分

;WITH CTE AS (
    SELECT CHARINDEX('/', @string) AS pos, idx = 1 

    UNION ALL

    SELECT CHARINDEX('/', @string, pos+1) AS pos, idx + 1 
    FROM CTE
    WHERE pos > 0
)
SELECT SUBSTRING(@string, 
                 (SELECT pos FROM CTE WHERE idx = 2) + 1, 
                 (SELECT pos FROM CTE WHERE idx = 3) - (SELECT pos FROM CTE WHERE idx = 2) - 1)

答案 2 :(得分:1)

如果必须选择的字符串具有固定长度并且在第二次出现'/'后将会这样做

DECLARE @document varchar(64);
SELECT @document = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'
select Substring(@document, CHARINDEX('/', @document,(SELECT CHARINDEX('/', @document)+1))+1,6)

答案 3 :(得分:1)

我写了一个函数来分割我的字符串数据。这对你也有好处:

   CREATE FUNCTION [dbo].[SPLIT]
(
    @ROWDATA NVARCHAR(2000),
    @SPLITON NVARCHAR(5)
)  
RETURNS @RTNVALUE TABLE 
(
    ID INT IDENTITY(1,1),
    DATA NVARCHAR(100)
) 

AS  
BEGIN 
    DECLARE @CNT INT
    SET @CNT =  LEN(@SPLITON)

WHILE (CHARINDEX(@SPLITON,@ROWDATA)>0)
BEGIN
    INSERT INTO @RTNVALUE (DATA)
    SELECT 
        DATA = LTRIM(RTRIM(SUBSTRING(@ROWDATA,1,CHARINDEX(@SPLITON,@ROWDATA)-1)))

    SET @ROWDATA = SUBSTRING(@ROWDATA,CHARINDEX(@SPLITON,@ROWDATA)+1,LEN(@ROWDATA))
    SET @CNT = @CNT + @CNT
END

INSERT INTO @RTNVALUE (DATA)
SELECT DATA = LTRIM(RTRIM(@ROWDATA))

RETURN
END

创建此功能然后

SELECT DATA FROM SPLIT ('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS','/');

这将返回一个表格,其中每一行都是字符串的“/”分隔数据。

答案 4 :(得分:1)

感谢您的提问 如果粗体区域长度不是6位

,请尝试以下方法帮助您
    DECLARE @document varchar(64);
    DECLARE @start int;
    DECLARE @lenght int;
    SELECT @document = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'
    select @start = CHARINDEX('/',@document,CHARINDEX('/',@document)+1)+1
    select @lenght = CHARINDEX('/',@document,CHARINDEX('/',@document,CHARINDEX('/',@document)+1)+1) - @start
    select Substring(@document,@start, @lenght)