2015-03-08 2 views
0

Использование SQL Server 2008Как разбить значение строки

Я хочу разделить строку точкой с запятой. Строковое значение имеет точку с запятой, иногда без точки с запятой.

Пример # 1:

String = abceder-ere1212;eferere2121212 (with Semicolon) 

Выход

string1 = abceder-ere1212 
string2 = eferere2121212 

Пример № 2:

String: abcederdfdfd (without Semicolon) 

Выход

string1 = abcederdfdfd 
string2 = '' 

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

DECLARE 
    @remarks varchar(max), 
    @vc_pen varchar(max), 
    @vc_adjust varchar(max) 

Select @remarks = remarks  
from table1 

SELECT 
    @vc_pen = SUBSTRING(S, 1, P - 1), 
    @vc_adjust = SUBSTRING(S, P + 1, L - P) 
FROM 
    (SELECT 
     S = @remarks, 
     P = CHARINDEX(';', @remarks), 
     L = LEN(@remarks)) s; 

Как написать запрос или функцию для разделения строки? Просьба помочь

+0

Если это всегда 0 или 1 точка с запятой, просто напишите функцию, которая проверяет ее с помощью charindex, а в случае, если она -1, возвращает всю вещь в первой части, а если нет, верните две части, используя левую/правую или подстроку. –

ответ

0

Попробуйте что-то вроде общего:

CREATE FUNCTION split 
( 
    @string VARCHAR(MAX), 
    @delimiter CHAR(1) 
) RETURNS @output TABLE(index INT, splitteddata VARCHAR(MAX)) 
BEGIN 
    DECLARE @start INT, @end INT, @index INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string), @index = 1 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitteddata) 
     VALUES(@index, SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @index = @index + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 
    END 
    RETURN 
END 

Query: 
SELECT * 
FROM split('abceder-ere1212;eferere2121212',';') 
Output: 
1 abceder-ere1212 
2 eferere2121212 
+0

спасибо. Но мне нужно получить выход 1 и output2, если я хочу выход 1, тогда мне нужно получить первую строку перед точкой с запятой, если вывод 2, тогда мне нужно получить вторую строку после точки с запятой. Как получить – Gopal

+0

Если я получу вас правильно, вам нужно будет вызвать функцию дважды, добавив дополнительный параметр, который вам нужен индекс строки. – SMA

+0

Мне нужно получить один вывод за один раз до точки с запятой или после точки с запятой. Как его получить. Пожалуйста помогите. – Gopal

0

Попробуйте что-то вроде этого ....

Test Data

DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX)) 

INSERT INTO @Table VALUES 
(1 , 'abceder-ere1212;eferere2121212') 
,(2 , 'abceder-ere1234') 

Запрос

SELECT ID 
     ,REPLACE(Split.a.value('.', 'VARCHAR(100)'), '000000', '') Value 
     ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) Output_Value 
FROM (SELECT ID 
       ,Cast ('<M>' + Replace(CASE WHEN Value NOT LIKE '%;%' THEN Value + ';000000' 
            ELSE Value END 
         , ';', '</M><M>') + '</M>' AS XML) AS Data 
     FROM @Table) AS A 
     CROSS APPLY Data.nodes ('/M') AS Split(a) 

Результат

╔════╦═════════════════╦══════════════╗ 
║ ID ║  Value  ║ Output_Value ║ 
╠════╬═════════════════╬══════════════╣ 
║ 1 ║ abceder-ere1212 ║   1 ║ 
║ 1 ║ eferere2121212 ║   2 ║ 
║ 2 ║ abceder-ere1234 ║   1 ║ 
║ 2 ║     ║   2 ║ 
╚════╩═════════════════╩══════════════╝ 

Если й прежде чем только два возможных значения

вы можете сделать следующее

тестовых данных

DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX)) 

INSERT INTO @Table VALUES 
(1 , 'abceder-ere1212;eferere2121212') 
,(2 , 'abceder-ere1234') 

Запрос

;WITH CTE AS 
(SELECT ID 
     ,REPLACE(CASE WHEN Value NOT LIKE '%;%' 
       THEN Value + '|000000' 
       ELSE Value END, ';', '|') AS Value 
    FROM @Table 
) 
SELECT ID 
     ,LEFT(Value , CHARINDEX('|', Value) -1) FirstValue 
     ,REPLACE(RIGHT(Value, LEN(Value) - CHARINDEX('|', Value)), '000000', '') SecondValue 
FROM CTE 

Результат Набор

╔════╦═════════════════╦════════════════╗ 
║ ID ║ FirstValue ║ SecondValue ║ 
╠════╬═════════════════╬════════════════╣ 
║ 1 ║ abceder-ere1212 ║ eferere2121212 ║ 
║ 2 ║ abceder-ere1234 ║    ║ 
╚════╩═════════════════╩════════════════╝ 
0

Попробуйте использовать PARSENAME функцию следующим образом:

SELECT PARSENAME(REPLACE(@remarks, ';', '.'), 2) AS string1, 
     PARSENAME(REPLACE(@remarks, ';', '.'), 1) AS string2 

Вот код, который даст свои части в разделенных областях:

DECLARE @text VARCHAR(1000); 
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''',''') + '''' 
EXEC(@text) 

В другом смысле это лучше (с отправкой результата в таблицу):

DECLARE @text VARCHAR(1000) 
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''' As part union all SELECT ''') + ''' As part' 
EXEC(@text) 

И меняется сверху вниз за то, resultTable:

SET @text = 'SELECT part INTO resultTable FROM (select ''' + REPLACE(@remarks, ';', ''' As part UniON ALL SELECT ''') + ''' As part) dt ' 

Я думаю, что этот ответ полезен, когда вы устанавливаете результаты в datatable или как результате stored procedure.

+0

Если вы хотите, вы можете отправлять поля в временную таблицу и использовать их;). Я знаю, что это не прямой ответ, но я надеюсь, что это поможет. –

Смежные вопросы