1

嗨,我正在编写一些 TSQL 代码实践,试图计算字符串中的元音、小写和大写字母,我的代码适用于元音,但不知何故它将所有字母都计为小写字母,这是我的代码:

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'

请帮忙,谢谢

4

1 回答 1

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/上的其他人可以提供更多信息。

于 2013-03-08T08:25:16.337 回答