2013-03-08 92 views
1

嗨我寫了一些TSQL代碼的做法,試圖計算一個字符串中的元音字母,小寫和大寫字母,我的代碼工作了元音,但不知何故,計算所有字母爲小寫字母,這是我的代碼:TSQL計數uppcase和小寫字母

DECLARE @name VARCHAR(200) ='Abc Efg Hij' 
DECLARE @i int = 1 
DECLARE @numVowels int = 0 
DECLARE @numLower int = 0 
DECLARE @numUpper int = 0 

WHILE @i <= LEN(@name) 
    BEGIN 
     IF PATINDEX('%' + LOWER(SUBSTRING(@name, @i, 1)) + '%', 'aeiou') > 0 
      BEGIN 
       SET @numVowels += 1 
      END 
     IF SUBSTRING(@name, @i, 1) BETWEEN 'a' AND 'z' 
      BEGIN 
       SET @numLower += 1 
      END 
     ELSE IF SUBSTRING(@name, @i, 1) BETWEEN 'A' AND 'Z' 
      BEGIN 
       SET @numUpper += 1 
      END 
     PRINT SUBSTRING(@name, @i, 1) 

     SET @i +=1 
    END 


PRINT 'There are ' + CAST((@numVowels) AS VARCHAR(200)) + ' vowels' 
PRINT 'There are ' + CAST((@numLower) AS VARCHAR(200)) + ' lower-case letters' 
PRINT 'There are ' + CAST((@numUpper) AS VARCHAR(200)) + ' upper-case letters' 

請幫幫忙,謝謝

回答

1

你的問題與整理,但有幾個測試在我的腦海裏提出更多的問題比解決的。首先,有你的代碼的工作,你只需要更換兩次出現的:

IF SUBSTRING(@name, @i, 1) BETWEEN ... 

IF SUBSTRING(@name, @i, 1) COLLATE Latin1_General_BIN BETWEEN ... 

強制二進制排序將防止SQL Server考慮'a''A'是相等的。

現在在我的腦海中提出的問題是:

  • 爲什麼不將其與像Latin1_General_CS_AS(9小寫,0大寫)區分大小寫的整理工作?這是我第一次嘗試,因爲我期待您的問題由不區分大小寫的排序規則造成的,我希望它有一個區分大小寫來解決一個
  • 爲什麼它部分地與SQL_Latin1_General_CP1_CS_AS(8小寫,1合作上-案件) ?只有第一個'A'不被視爲小寫字符,我不知道爲什麼。

這就是我可以從上面我的.NET開發人員的腦海裏。如果你正在尋找更多的信息,也許別人在這裏或https://dba.stackexchange.com/可以提供更多的信息。

+0

非常感謝你@ybo!只要'Latin1_General_BIN'有效,我就很開心。 – 2013-03-08 08:46:03

+0

如果您認爲這是一個有效的答案,請標記爲這樣,謝謝! – ybo 2013-03-08 13:05:36

相關問題