2014-10-09 7 views
0

Поэтому у меня есть строки в SQL, как этотИзвлечение кода из строки

Declare @Denumire varchar(2000) = '''Name''name(109)'',''name (1921)'',''name name name name name (2312)'',''name name name name name (2358)''' 

То, что я хочу, чтобы получить каждый код для каждого имени.

Для этого примера было бы

109,1921,2312,2358 

мне удалось получить последний код 2358 с помощью запроса.

Declare @Cod varchar(20) 
    Declare @test varchar(3000) 
    declare @CoduriFinale varchar(2000) 
    Declare @rDenumire varchar(3000) = REVERSE(@Denumire) 
    SELECT @Cod = LEFT(@rDenumire,CHARINDEX (' ' ,@rDenumire , 0)) 
    SELECT @Cod = REPLACE (@Cod , '(' , '') 
    SELECT @Cod = REPLACE (@Cod , ')' , '')   
    set @CoduriFinale = REVERSE(RTRIM(LTRIM(SUBSTRING(@Cod,2,6))))+',' 
    set @test = SUBSTRING(@rDenumire,CHARINDEX (',',@rDenumire, 0),LEN(@rDenumire)) 
    set @rDenumire = @test 
    print @CoduriFinale 
    print @test 

Так что я сделал здесь, реверс струна отверстие (это будет убедиться, что первое слово), пока ' ' не мой код, я не могу заставить его работать в цикле в то время как для этого для строки отверстия.

PS: моя строка на самом деле больше строк, разделенных запятой.

+0

T-SQL является жестоким при манипулировании строкой, было бы проще передать данные клиенту, а затем использовать Regex для извлечения данных. Разумеется, было бы лучше сделать синтаксический анализ * до * хранения денормализованных данных в базе данных. Если вы беспокоитесь о таблицах со слишком большим количеством столбцов, вы можете использовать [разреженные столбцы] (http://msdn.microsoft.com/en-us/library/cc280604.aspx), чтобы хранить сотни столбцов с минимальным воздействием. –

ответ

1
CREATE Function [fnRem](@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    WHILE PATINDEX('%[^0-9,]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9,]%', @strText), 1, '') 
    END 
    RETURN @strText 
END 






    Declare @test varchar(3000) 

    Declare @Denumire varchar(2000) = '''FABRICOM SYSTEMES D''ASSEMBLAGE (109)'',''VALEO VISION SAS (1921)'',''INERGY AUTOMOTIVE SYSTEMS GERMANY GMBH (2312)'',''TRW AUTOMOTIVE SAFETY SYSTEMS S.R.L. (2358)''' 

    set @test =dbo.fnRem(@Denumire) 

    select @test 

Выход 109,1921,2312,2358

+0

Поскольку SQL - это язык, основанный на наборе, следует избегать как можно большего числа циклов и [RBAR] (http://www.sqlservercentral.com/Forums/Topic642789-338-1.aspx). – SouravA

+1

Это работает спасибо. – CiucaS

0

попробовать команды вместе с PATINDEX: что-то вроде ниже

enter image description here

+0

Я предполагаю, что это это идентификаторы рядом с именами, поэтому он хочет получить набор результатов. – Schalk

+0

Он хочет получить результат с запятой. – SouravA

0

Каждая строка уже через запятую, как вы говорите. Просто используйте REPLACE функцию, чтобы заменить все ниже с пустой строкой («»)

The string 'name', the apostrophes ('') and the brackets

Было бы вроде как мульти-вложенных ЗАМЕНЫ функций.

Когда вы применяете вложенные функции REPLACE, вы можете оставить цифровую запятую.

SELECT REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(@Denumire, '(', ''), ')', ''), 'name', ''), '''', ''), ' ', '') 
+0

Это не будет работать, поскольку имя - это то, что я написал здесь, но есть настоящие имена, так или иначе. – CiucaS

0

Это будет работать

DECLARE @alphaplace INT,@string varchar(200)='[email protected]@@' 
SET @alphaplace = PATINDEX('%[^0-9]%', @string) 
WHILE @alphaplace > 0 
BEGIN 
SET @string = STUFF(@string, @alphaplace, 1, ',') 

SET @alphaplace = PATINDEX('%[^0-9_,]%', @string) 

END 
select REPLACE(@string,',,',',') 
+0

Для 'name (109)' результат есть ,,, 109, так или иначе, я уже нашел решение. – CiucaS

+0

Я ожидал, что запятые будут играть с моим кодом – Recursive

0

enter image description here

Я не смог добавить свой код. так что добавлено в качестве изображения

OUTPUT 
109,1921,2312,2358 
Смежные вопросы