Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL2000 парсинг строки  [new]
Коля77
Member

Откуда:
Сообщений: 84
Помогите пропарсить поле с даннымии такого вида, могут быть разные варианты
'2.3-5' результат null
'2.3-5,8.2' результат 8.2
'6.3,12.7-8' результат 6.3
'13.2-4,8,19.2-9' результат 8
'6' результат 6
null результат null
'10.3-4,5,1.2-6,7' результат 5 полько первое значение, остальное игнорировать

Разделитель групп запятая
Надо получить число которое не связанно в группе с вместе с разделителем '-'
28 мар 12, 18:02    [12329297]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @t table (id int identity, val varchar(100))
insert into @t
values
 ('2.3-5')
,('2.3-5,8.2')
,('6.3,12.7-8')
,('13.2-4,8,19.2-9')
,('6')
,(null)
,('10.3-4,5,1.2-6,7');

with cte
as
(
select id, n, substring( val, i2 + 1, i1 - i2 -1 ) val
from
(
select id, t1.val
     , charindex( ',', t1.val + ',', number ) i1
     , case when number = 0 then 0 else charindex( ',', t1.val + ',', number - 1 ) end i2
     , number n
  from @t t1 
    inner join master.dbo.spt_values t2
      on t2.type = 'P' and number between 0 and len( t1.val )
) t where i1 != i2
)
select t1.*, t2.val from @t t1 
  left join
  (
  select top 1 with ties * from cte 
  where isnumeric(val) = 1
  order by row_number() over ( partition by id order by n)
  ) t2
  on t1.id = t2.id
28 мар 12, 18:55    [12329588]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Коля77
Member

Откуда:
Сообщений: 84
Спасибо конечно, может код на 2005 или 2008 работает но у меня на 2000 не работает :(
29 мар 12, 10:42    [12331696]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Коля77
Спасибо конечно, может код на 2005 или 2008 работает но у меня на 2000 не работает :(


А поэтому в правилах оформления и написано приводить результат
Select @@version
29 мар 12, 11:04    [12331863]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Коля77
Member

Откуда:
Сообщений: 84
Я в теме написал SQL200. Извините что ввел в заблуждение

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

С кодом Knyazev Alexey частично разобрался, постараюсь подогнать для 2000
29 мар 12, 11:07    [12331895]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Коля77
Я в теме написал SQL200. Извините что ввел в заблуждение

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

С кодом Knyazev Alexey частично разобрался, постараюсь подогнать для 2000


Даже если написали sql2000 имеет сервиспаки, cu и тп,
Что то в них может быть пофиксино, что то добавлено.
Соответственно приведение полной версии может помочь избежать ошибок связанных с такими нюансами.
29 мар 12, 11:23    [12332000]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Ozerov
Коля77
Я в теме написал SQL200. Извините что ввел в заблуждение

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

С кодом Knyazev Alexey частично разобрался, постараюсь подогнать для 2000


Даже если написали sql2000 имеет сервиспаки, cu и тп,
Что то в них может быть пофиксино, что то добавлено.
Соответственно приведение полной версии может помочь избежать ошибок связанных с такими нюансами.

Какой такой павлин-мавлин? Достаточно переписать cte и оконные функции, после чего все заработает. Сервиспаки и т.д. вобщем-то пофигу для данной задачи.
+ На основе запроса от Knyazev Alexey
DECLARE @t TABLE (
    id INT IDENTITY
  , val VARCHAR(100) )
INSERT  INTO @t
        ( val )
        SELECT  '2.3-5'
        UNION ALL
        SELECT  '2.3-5,8.2'
        UNION ALL
        SELECT  '6.3,12.7-8'
        UNION ALL
        SELECT  '13.2-4,8,19.2-9'
        UNION ALL
        SELECT  '6'
        UNION ALL
        SELECT  NULL
        UNION ALL
        SELECT  '10.3-4,5,1.2-6,7'

SELECT  t1.*
      , t2.*
FROM    @t t1
LEFT JOIN (
            SELECT  c1.id
                  , c1.val
            FROM    (
                      SELECT    id
                              , n
                              , SUBSTRING(val, i2 + 1, i1 - i2 - 1) val
                              , i2 pos
                      FROM      (
                                  SELECT    id
                                          , t1.val
                                          , CHARINDEX(',', t1.val + ',', number) i1
                                          , CASE WHEN number = 0 THEN 0
                                                 ELSE CHARINDEX(',', t1.val + ',', number - 1)
                                            END i2
                                          , number n
                                  FROM      @t t1
                                  INNER JOIN master.dbo.spt_values t2
                                  ON        t2.type = 'P'
                                            AND number BETWEEN 0 AND LEN(t1.val)
                                ) t
                      WHERE     i1 != i2
                    ) c1
            JOIN    (
                      SELECT    MIN(t.pos) pos
                              , t.id
                      FROM      (
                                  SELECT    id
                                          , n
                                          , SUBSTRING(val, i2 + 1, i1 - i2 - 1) val
                                          , i2 pos
                                  FROM      (
                                              SELECT    id
                                                      , t1.val
                                                      , CHARINDEX(',', t1.val + ',', number) i1
                                                      , CASE WHEN number = 0 THEN 0
                                                             ELSE CHARINDEX(',', t1.val + ',', number - 1)
                                                        END i2
                                                      , number n
                                              FROM      @t t1
                                              INNER JOIN master.dbo.spt_values t2
                                              ON        t2.type = 'P'
                                                        AND number BETWEEN 0 AND LEN(t1.val)
                                            ) t
                                  WHERE     i1 != i2
                                ) t
                      WHERE     ISNUMERIC(t.val) = 1
                      GROUP BY  t.id
                    ) c2
            ON      c1.id = c2.id
                    AND c1.pos = c2.pos
          ) t2
ON      t1.id = t2.id
29 мар 12, 11:44    [12332214]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Я про оформление в общем. Объяснил почему рекомендуется.
29 мар 12, 11:48    [12332250]     Ответить | Цитировать Сообщить модератору
 Re: SQL2000 парсинг строки  [new]
Коля77
Member

Откуда:
Сообщений: 84
Спасибо.
Теперь вод думаю как теперь все это прикрутить к такому запросу
Select date,
	l.[tp_Title], t0.[tp_ID] as ID_Task, 
	[dbo].[OUP_fun_WebNameURL](l.[tp_Title])+N'/EditForm.aspx?ID=' + cast(t0.[tp_ID] as nvarchar(25)) as Url_ID_Task
	, t5.[nvarchar1] as Task
	, t5.[tp_ID] as Task_Name_ID
	, [dbo].[OUP_fun_WebNameURL](N'Tasks of '+ Theme.[nvarchar1]) + N'/EditForm.aspx?ID=' + cast(t5.[tp_ID] as nvarchar(25)) as Task_Name_URL
	, t1.[nvarchar1] as FIO 
	, t1.[tp_ID] as ID_FIO 
	, CASE WHEN @dt3 <=  cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime2]), 1) as smalldatetime) and @dt2 >=  cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime1]), 1) as smalldatetime)  then 1 else 0 end 'Period'
	, cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime1]), 1) as smalldatetime) as TaskStart
	, cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime2]), 1) as smalldatetime) as TaskFinish
	, t0.[float1] as Percentage_Loading
	, t0.[nvarchar1] as 'VAL'
	, t0.tp_Created 
	, Theme.[tp_ID] as ID_Theme
	, Theme.[nvarchar1] as Theme
	, cast(Theme.[ntext2] as nvarchar(4000)) as Theme_Des
	, null Work_Time, null NonWorking_Cod
	, Theme.[nvarchar3] as MSProject
	from Lists AS L 
	INNER JOIN UserData as t0 ON t0.tp_ListId = L.tp_ID and L.tp_Title LIKE N'Employment in %'
	LEFT OUTER JOIN UserData AS t1 ON (t0.[int2]=t1.[tp_ID] AND t1.tp_ListId = @L1) 
	LEFT OUTER JOIN UserData AS Theme ON (l.[tp_Title] like 'Employment in ' + Theme.[nvarchar1] and Theme.tp_ListId = @L2) 
	LEFT OUTER JOIN UserData AS t5 ON (t0.[int1]=t5.[tp_ID] AND t5.tp_ListId = 
			(SELECT [tp_ID] FROM [STS_r-projsrv_1].[dbo].[Lists] 
				where [tp_Title] Like N'Tasks of %' + replace(cast(L.[tp_Title] as nvarchar(255)), 'Employment in ',''+'%') ))
full join @t as t4
on t4.[Date] between isnull(cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime1]), 1) as smalldatetime),@dt2) and isnull(cast(convert(nvarchar(10), DATEADD(ss, DATEDIFF(ss,GETUTCDATE(),GETDATE())+3600, t0.[datetime2]), 1) as smalldatetime),@dt2) and TimeWorkAvailability > 0 
29 мар 12, 17:00    [12335118]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить