2014-12-29 8 views
-2

У меня есть строка в SQL, как
Как подстроить строку в SQL Server 2008?

CMS/00014456582//004535/JCR_110914_NEW_4535 CMS

Я хочу прочитать строку жирным шрифтом.
Как читать эту строку, используя функцию подстроки.

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

Это один ответ на мой вопрос. Но я хочу прочитать строку после двух разделов '/' - file seperator.

У меня есть другая строка, которая, как INF/000079160100/P - (34) случаях NET БАНКИНГ и я хочу прочитать (этого) Значение .eg спасибо заранее.

+0

Если это Sql Server, пожалуйста, удалите тег MySql – StuartLC

+2

ли длины динамический или фиксированный? Вы хотите сделать это по одному значению или набору значений? –

+0

Будьте понятны, что является окончательным ожидаемым выходом –

ответ

1

это будет делать, если строка, которая должна быть выбрана фиксированной длиной, и после 2-го из вхождение «/»

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

спасибо решить мою проблему .. – vijayk

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

Я был написал функцию, чтобы разделить мои строки данных. Это может быть полезно для вас тоже:

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','/'); 

Это возвращает таблицу, каждая строка «/» отделено данные вашей строки.

+0

nic code..but solve my проблема с помощью второго. – vijayk

2

Довольно гибкий способ получить то, что вы хотите, - это использование recursive 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 

Используя выше КТР вы можете легко извлечь любой часть строки, содержащейся в, скажем, 1-й и 2-й слэш, или 2-го и 3-го и т.д.:

;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) 
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) 
Смежные вопросы