2013-03-08 4 views
1

Привет Я пишу некоторые методы кода TSQL, пытаясь подсчитать гласные, строчные и прописные буквы в строке, мой код работал на гласные, но почему-то он считает все буквы строчными буквами. мой код:TSQL count 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'. –

+0

Если вы считаете, что это правильный ответ, отметьте его как таковое, спасибо! – ybo

Смежные вопросы