Найти положение символа с разделителями в строке (SQL Server) - PullRequest
1 голос
/ 18 декабря 2009

У меня есть строка Переменная

тест = Ариа | 123 | MALE | СТУДЕНТ | ДОМОХОЗЯЙКИ

Я использую | в качестве символа с разделителями. если я хочу извлечь данные из 2-го вхождения канала до 3-го вхождения. мне нужно получить «MALE» сверху строки.

любая помощь приветствуется

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

Непроверенные

SELECT
    SUBSTRING (
       @test,
       CHARINDEX('|', @test, CHARINDEX('|', @test) + 1) + 1,
       CHARINDEX('|', @test, CHARINDEX('|', @test, CHARINDEX('|', @test) + 1) + 1) - 1
    )

Лучше было бы разбить строку на таблицу и использовать ROW_NUMBER () для извлечения третьего элемента. На основании этого Массивы и списки в SQL Server

DECLARE @test varchar(100) = 'HARIA|123|MALE|STUDENT|HOUSEWIFE'

SELECT TOP 8000
    Num
INTO
    #Number
FROM
    (
    SELECT
       ROW_NUMBER() OVER (ORDER BY c1.object_id) AS Num
    FROM
       sys.columns c1, sys.columns c2, sys.columns c3
    ) N

SELECT
    ROW_NUMBER() OVER (ORDER BY Num) AS Rank,
    LTRIM(RTRIM(SUBSTRING(@test,
                          Num,
                          CHARINDEX('|', @test + '|', Num) - Num
                ))) AS Value
FROM
    #Number
WHERE
    Num <= LEN (@test)
    AND
    SUBSTRING('|' + @test, Num, 1) = '|'

DROP TABLE #Number
3 голосов
/ 18 декабря 2009

Попробуйте это

Решение 1: (с использованием таблицы номеров)

declare @str varchar(1000)
set @str ='HARIA|123|MALE|STUDENT|HOUSEWIFE'
--Creating a number table
;with numcte as( 
select 1 as rn union all select rn+1 from numcte where rn<LEN(@str)),
--Get the position of the "|" charecters
GetDelimitedCharPos as(
select ROW_NUMBER() over(order by getdate()) seq, rn,delimitedcharpos
from numcte 
cross apply(select SUBSTRING(@str,rn,1)delimitedcharpos) X where delimitedcharpos = '|')

--Applying the formula SUBSTRING(@str,startseq + 1,endseq-startseq + 1)
-- i.e. SUBSTRING(@str,11,15-11) in this case

select top 1 SUBSTRING(
    @str
    ,(select top 1 rn+1 from GetDelimitedCharPos where seq =2)
    ,(select top 1 rn from GetDelimitedCharPos where seq =3) - 
    (select top 1 rn+1 from GetDelimitedCharPos where seq =2)
    ) DesiredResult
from GetDelimitedCharPos

Решение 2: (с использованием XQuery)

DECLARE @xml as xml,@str as varchar(100),@delimiter as varchar(10)
SET @str='HARIA|123|MALE|STUDENT|HOUSEWIFE'
SET @xml = cast(('<X>'+replace(@str,'|' ,'</X><X>')+'</X>') as xml)
SELECT ShrededData as DesiredResult FROM(
SELECT 
ROW_NUMBER() over(order by getdate()) rn
,N.value('.', 'varchar(10)') as ShrededData FROM @xml.nodes('X') as T(N))X
WHERE X.rn = 3 -- Specifying the destination sequence value(here 3)

Выход (в обоих случаях)

DesiredResult
MALE
0 голосов
/ 23 февраля 2010

Я нашел это . Использование t-Sql для цикла. Хорошая справка по синтаксису тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...