2011-06-23 39 views

回答

1
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

有沒有其他的方式做它沒有寫函數。我們通過循環字符串來做到這一點。 – Pearl

+0

是的,檢查我的答案我編輯它 –

+0

Tanq它的工作原理:-) – Pearl

-1
SELECT * FROM tbl_name WHERE col_name REGEXP 'vowels' 
+0

什麼是REGEXP? 請讓我知道天氣是一個sp? – Pearl

3

一種方法是使用常提到的「分裂」用戶自定義函數,並使用它像這樣:

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

的一些例子split UDF可以在這裏找到:T-SQL: Opposite to string concatenation - how to split string into multiple records

如果這是一個常見的查詢你正在運行,我想我會很想考慮計算值插入到表中e並將該號碼存儲在該行中。

+0

有沒有其他的方式做它沒有寫函數。我們通過循環字符串來做到這一點。 – Pearl

+1

我認爲我們不需要'AEIOU',因爲'sql'不區分大小寫。 –

+2

@Miroprocessor - 這是如果您使用區分大小寫的排序規則。 – AdaTheDev

0
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

Thanku :-)它的工作原理。 – Pearl

+0

你能否向我解釋一下querry中使用的陳述。並使用cte。 – Pearl

+0

@Pearl - 「with」是一個常見的表格表達式。在這裏閱讀更多關於它http://msdn.microsoft.com/en-us/library/ms175972.aspx我這種情況下,它遞歸地使用,以獲得每個遞歸的單詞。 –

0

的OP提到這樣做沒有的功能,所以嘗試一下本作一個字符串(前提是你要有"Numbers"表):

--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') 

OUTPUT:

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

(1 row(s) affected) 

這裏如何計算表中的許多字符串(提供了"Numbers"表)的元音(無功能)的示例:

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 

OUTPUT:

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

(3 row(s) affected) 

你基本上需要得到一個分割功能,然後分裂的一個空間中,here is a similar answer這也解釋了關於分裂的功能和它的使用。我不確定OP爲什麼不想使用某個功能。

相關問題