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

Откуда: Казань
Сообщений: 14
у меня в селекте строка
' 000998 , 000999 , 001000'
как мне узнать сколько в строке запятых?
9 июн 09, 13:54    [7280773]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
titanadm
Member

Откуда:
Сообщений: 16
declare @v varchar(255)
select @v = 'a,b,c'
select len(@v) - len(replace(@v,',',''))
9 июн 09, 14:03    [7280828]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
titanadm
declare @v varchar(255)
select @v = 'a,b,c'
select len(@v) - len(replace(@v,',',''))
declare @v varchar(255)
select @v = 'a,b,c'
select datalength(@v) - datalength(replace(@v,',',''))
9 июн 09, 14:07    [7280849]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
efdm
Member

Откуда: Москва
Сообщений: 310
можно и покривее:

declare @s as varchar(256)
select @s = '000998 , 000999 , 001000'

select max( case when @s like '%' + replicate(',%', n) then n else 0 end) cnt
from (
	select top 1000 number n
	from dbo.spt_values
	where number > 0
	group by number 
	order by 1
) t
9 июн 09, 14:10    [7280879]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
efdm
можно и покривее:

declare @s as varchar(256)
select @s = '000998 , 000999 , 001000'

select max( case when @s like '%' + replicate(',%', n) then n else 0 end) cnt
from (
	select top 1000 number n
	from dbo.spt_values
	where number > 0
	group by number 
	order by 1
) t
Можно немного выпрямить:
declare @s as varchar(256)
select @s = '000998 , 000999 , 001000'

SELECT COUNT(*)
FROM master.dbo.spt_values
WHERE type='P' AND SUBSTRING(@s,number,1)=',';
9 июн 09, 14:14    [7280924]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
Led
Member

Откуда: Казань
Сообщений: 14
всем спасибо...это я уже сделала...получилась длинная строка
len(substring(rtrim(ltrim(dbo.GetDescription([blaid]))),2,400))-len(REPLACE(dbo.GetDescription([blaid]),',',''))+1

я подумала, мож функция какая есть?
9 июн 09, 14:15    [7280935]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Led
всем спасибо...это я уже сделала...получилась длинная строка
len(substring(rtrim(ltrim(dbo.GetDescription([blaid]))),2,400))-len(REPLACE(dbo.GetDescription([blaid]),',',''))+1

я подумала, мож функция какая есть?
Я ж Вам уже говорил: LEN - это неправильно!.
Используйте DATALENGTH
Не верите? Тогда посчитайте своим методом количество запятых, например, в такой строке:
' 000998 , 000999 , 001000  ,'
9 июн 09, 14:24    [7281003]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
titanadm
Member

Откуда:
Сообщений: 16
datalength тоже плохо:

declare @v nvarchar(255)
select @v = 'a,b,c'
select datalength(@v) - datalength(replace(@v,',',''))

Тогда уж

declare @v varchar(255)
select @v = 'a,b,c ,'
select @v = replace(@v,' ','_')
select len(@v) - len(replace(@v,',',''))

И несколько ритуальных проклятий.
9 июн 09, 16:56    [7282132]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
titanadm
datalength тоже плохо:

declare @v nvarchar(255)
select @v = 'a,b,c'
select datalength(@v) - datalength(replace(@v,',',''))

Тогда уж

declare @v varchar(255)
select @v = 'a,b,c ,'
select @v = replace(@v,' ','_')
select len(@v) - len(replace(@v,',',''))

И несколько ритуальных проклятий.
Ну, если Вы так настаиваете, то можно вот так.
Хотя в оригинальной постановке задачи фигурируют неюникодные строки.

Вообще, никакой Америки здесь не открыть: много раз обсуждалось.
9 июн 09, 18:25    [7282746]     Ответить | Цитировать Сообщить модератору
 Re: Число вхождений  [new]
titanadm
Member

Откуда:
Сообщений: 16
Хотя в оригинальной постановке задачи фигурируют неюникодные строки.


Я же про жизнь. Кто-то сделал таблицу, кто-то написал функцию с datalength, кто-то поменял тип поля на nvarchar и готова довольно труднонаходимая ошибка.

Ну, если Вы так настаиваете, то можно вот так.
Вообще, никакой Америки здесь не открыть: много раз обсуждалось.


Это уж без сомнений. :)
9 июн 09, 20:06    [7283088]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить