2013-03-08 61 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

相关问题