2016-11-24 4 views
-5

У меня есть 5 строк данных, как, как показано нижеSQL запрос, чтобы получить мультипликатор «» позиции из строки

Image 1

Теперь мне нужно найти положение каждой «» от моей входной строки ,

Мой вывод должен быть таким:

Image 2

+1

Какова предел количества запятых, которые у вас будут? –

+0

Привет @RichBenner - Спасибо за ответ. В настоящее время у меня всего 10 запятых. Но может быть, есть возможность увеличить запятую. В этом случае также должен работать код – Akhil

+1

Зачем вам нужно найти позицию запятой? Что вы делаете с этой информацией, как только вы ее нашли? – iamdave

ответ

0

Пожалуйста, попробуйте этот вариант, который даст результат как ваш.

Create table #Table (rowNo int identity(1,1), ID varchar(100)) 
insert into #Table values('32132') 
insert into #Table values('32132,32132') 
insert into #Table values('32132,32132,6456,654,645') 

declare @TableRow int = (select count(*) from #Table),@Tableloop int = 1 
while(@Tableloop <= @TableRow) 
begin 
    Declare @var varchar(100) ; 
    SET @var = (select ID from #Table where [email protected]) 
    declare @count int = (select len(@var) - len(replace(@var, ',', ''))) 
    declare @loop int = 1; 
    declare @location int = 0; 
    print 'Row' + cast(@Tableloop as varchar(5)) 
    while (@loop <= @count) 
    begin 
     SET @location = (select charindex(',',@var,@location)) 
     print cast(@loop as varchar(5)) + ' Comma at ' + cast(@location as varchar(5)) 
     SET @location = @location +1 
     SET @loop = @loop + 1; 
    end 

    SET @Tableloop = @Tableloop + 1; 
END 
drop table #Table 

Это будет показывать правильный результат, просто поместите его в таблицу темп и отобразите его.

+0

Входные данные не только в виде INTEGERS, но и в виде Varchar. (Для Ex TOLL2163NSW, TOLL4115QLD, TOLL3025VIC, TOLL6105WA) – Akhil

+0

Я получаю данные из столбца system_client_id, который находится в таблице contract_lu. Вход может быть в Varchar, как я сказал вышеприведенный пример. И я подталкиваю эти данные в таблицу temp как #Tracking. Из этого я должен найти позицию запятой. – Akhil

+0

Ваше решение почти близко. Но можете ли вы, пожалуйста, помочь вам с решением с моей просьбой. – Akhil

0

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

Вы можете использовать функцию Джеффа Moden в ниже для достижения этой цели, используя следующие:

select i.ID 
     ,ItemNumber 
     ,Item as IDSplit 
from Input i 
    cross apply dbo.DelimitedSplit8K(i.ID,',') s; 

Который возвращает следующую:

ID           | ItemNumber | IDSplit 
````````````````````````````````````````````|````````````|````````` 
21321,32154,84655,65465,65476,89799,65464 | 1   | 21321 
21321,32154,84655,65465,65476,89799,65464 | 2   | 32154 
21321,32154,84655,65465,65476,89799,65464 | 3   | 84655 
21321,32154,84655,65465,65476,89799,65464 | 4   | 65465 
21321,32154,84655,65465,65476,89799,65464 | 5   | 65476 
21321,32154,84655,65465,65476,89799,65464 | 6   | 89799 
21321,32154,84655,65465,65476,89799,65464 | 7   | 65464 
21313,32156,31656,32132      | 1   | 21313 
21313,32156,31656,32132      | 2   | 32156 
21313,32156,31656,32132      | 3   | 31656 
21313,32156,31656,32132      | 4   | 32132 

Строка Функция Split Джеффа Moden в:

/****** Object: UserDefinedFunction [dbo].[DelimitedSplit8K] Script Date: 24/11/2016 12:08:35 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[DelimitedSplit8K] 
--===== String Split function by Jeff Moden: http://www.sqlservercentral.com/articles/Tally+Table/72993/ 
--===== Define I/O parameters 
     (@pString VARCHAR(8000), @pDelimiter CHAR(1)) 
--WARNING!!! DO NOT USE MAX DATA-TYPES HERE! IT WILL KILL PERFORMANCE! 
RETURNS TABLE WITH SCHEMABINDING AS 
RETURN 
--===== "Inline" CTE Driven "Tally Table" produces values from 1 up to 10,000... 
    -- enough to cover VARCHAR(8000) 
    WITH E1(N) AS (
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
       ),       --10E+1 or 10 rows 
     E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
     E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front 
        -- for both a performance gain and prevention of accidental "overruns" 
       SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
       ), 
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter) 
       SELECT 1 UNION ALL 
       SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter 
       ), 
cteLen(N1,L1) AS(--==== Return start and length (for use in substring) 
       SELECT s.N1, 
         ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000) 
        FROM cteStart s 
       ) 
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found. 
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1), 
     Item  = SUBSTRING(@pString, l.N1, l.L1) 
    FROM cteLen l 
+0

Но не совсем так. Мне нужно найти все запятые в одной строке, как я разместил в примере скриншот – Akhil

+0

@AkhilDuvvuru Какова цель отчета по отслеживанию? – iamdave

+0

@John Cappelletti - Извините, я только заметил, что у меня есть следующие символы в данных() & /: # + – Akhil

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

  • Нет связанных вопросов^_^