найти количество слов, начинающихся с гласных в строке - PullRequest
2 голосов
/ 23 июня 2011

'База данных используется для хранения большого количества данных'

Мне нужно найти количество слов, начинающихся с гласных в приведенной выше строке.Кто-нибудь может дать мне идею сделать это

Ответы [ 5 ]

3 голосов
/ 23 июня 2011

Один из способов - использовать обычно упоминаемую «разделенную» пользовательскую функцию и использовать ее следующим образом:

SELECT COUNT(*)
FROM dbo.fnSplit(‘Data base is used to store large amount of data’, ' ') x
WHERE x.Value LIKE '[aeiouAEIOU]%'

Некоторые примеры разделения UDF можно найти здесь: T-SQL: в отличие от конкатенации строк - как разбить строку на несколько записей

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

1 голос
/ 23 июня 2011
declare @str2 varchar(max)='Data base is used to store large amount of data'

Declare @data varchar(max)
Declare @Cnt int
Set @Cnt = 0

While (Charindex(' ',@str2)>0)
Begin
Select @Data = ltrim(rtrim(Substring(@str2,1,Charindex(' ',@str2)-1)))

Set @str2 = Substring(@str2,Charindex(' ',@str2)+1,len(@str2))
if(SUBSTRING(@Data,1,1)='a' or SUBSTRING(@Data,1,1)='e' or SUBSTRING(@Data,1,1)='i' or  SUBSTRING(@Data,1,1)='o' or SUBSTRING(@Data,1,1)='u')
 begin
Set @Cnt = @Cnt + 1
End
End

Select @Data = ltrim(rtrim(@str2))
if(SUBSTRING(@Data,1,1)='a' or SUBSTRING(@Data,1,1)='e' or SUBSTRING(@Data,1,1)='i' or    SUBSTRING(@Data,1,1)='o' or SUBSTRING(@Data,1,1)='u')
 begin
 Set @Cnt = @Cnt + 1
 End

select @Cnt
0 голосов
/ 23 июня 2011

В описанном операторе это делается без функции, поэтому попробуйте это для одной строки (при условии, что у вас есть таблица «Числа» ):

--sp GEN_FN_GEN_ListToTable
DECLARE @String  varchar(500)
       ,@SplitOn char(1)
SELECT @String='the quick red fox jumped over the lazy brown dog, again.'
      ,@SplitOn=' '


SELECT
    COUNT(*) AS VowelCount
    FROM (SELECT
              LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
              FROM (
                       SELECT @SplitOn + @String + @SplitOn AS List2
                   ) AS dt
                  INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
              WHERE SUBSTRING(List2, number, 1) = @SplitOn
         ) dt2
    WHERE ListValue IS NOT NULL AND ListValue!='' AND LEFT(ListValue,1) IN ('a','e','i','o','u')

ВЫХОД:

VowelCount
-----------
2

(1 row(s) affected)

вот пример того, как посчитать гласные (без функции) со многими строками в таблице (при условии, что у вас есть «Числа» таблица):

DECLARE @YourTable table (RowID int, RowValue  varchar(500))

INSERT INTO @YourTable VALUES (1,'the quick red fox jumped over the lazy brown dog, again.')
INSERT INTO @YourTable VALUES (2,'just another example of some words.')
INSERT INTO @YourTable VALUES (3,'a b c d e f g h i j k l m n o p q r s t u v w x y z')

SELECT
    RowID,COUNT(*) AS VowelCount
    FROM (SELECT
              RowID, LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(' ', List2, number+1)-number - 1))) AS ListValue
              FROM (SELECT
                       RowID, ' ' + RowValue + ' ' AS List2
                       FROM @YourTable
                   ) AS dt
                  INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
              WHERE SUBSTRING(List2, number, 1) = ' '
         ) dt2
    WHERE ListValue IS NOT NULL AND ListValue!='' AND LEFT(ListValue,1) IN ('a','e','i','o','u')
    GROUP BY RowID

ВЫХОД:

RowID       VowelCount    
----------- -----------
1           2
2           3
3           5

(3 row(s) affected)

В основном вам нужно получить функцию разделения, а затем разделить ее на один пробел, здесь есть аналогичный ответ , который объясняет функцию разделения и использованиеЭто.Я не уверен, почему ОП не хочет использовать функцию.

0 голосов
/ 23 июня 2011
declare @S varchar(100) = 'Data base is used to store large amount of data'

;with cte as
(
  select case when upper(left(@S, 1)) in ('A','E','I','O','U') then 1 else 0 end as vow,
         stuff(@S, 1, charindex(' ', @S+' '), '')+' ' as rest
  where len(@S) > 0
  union all
  select case when upper(left(rest, 1)) in ('A','E','I','O','U') then 1 else 0 end as vow,
         stuff(rest, 1, charindex(' ', rest), '') as rest
  from cte         
  where len(rest) > 0
)
select coalesce(sum(vow), 0)
from cte
0 голосов
/ 23 июня 2011
SELECT * FROM tbl_name WHERE col_name REGEXP 'vowels'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...