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 に答える