2017-01-15 3 views
-1

이름 수정이름 보정

는, 요한은 결혼식 카드에 인쇄 게스트 이름의 일을 받고있다. John은 대문자 알파벳으로 시작하는 이름 만 인쇄하고 소문자 알파벳이나 특수 문자로 시작하는 이름은 거부하는 코드를 작성했습니다. (소문자 또는 특수 문자로 시작하는 이름) 거부 이름 1.Correct

:

당신의 임무는 다음을 수행하는 것입니다. 거부 된 이름의 첫 알파벳을 대문자로 변경해야하며 특수 문자의 경우에는 변경되지 않습니다.

2. 새로 수정 된 이름을 오름차순으로 출력하십시오.


표 형식

테이블 : 사람
필드 형식
이름 varchar (20)

샘플


샘플 인 테이블
이름
mohit
쿠날
마노
라즈
타냐
@man

출력 샘플 테이블
이름
@man 시도
마노
Mohit
타냐

해결 방법 : SQL 서버 2014

select name 
from person as per 
where (left(per.name,1) like '%[^A-Z]%' or left(per.name,1) like '% %') 
union 
select Upper(left(per.name,1))+right(per.name,len(per.name)-1) 
from person as per 
where left(per.name,1)<>left(Upper(per.name),1) 
collate Latin1_General_CS_AI 
order by per.name 

샘플 테스트의 경우는
아직도 일부 경쟁 시험에서 틀린 답을 얻고, 전달합니다. 내가 처리하지 않은 테스트 케이스를 제안하십시오.

+1

Welcome to stackoverflow. [ask]를 읽으십시오. –

+1

쿼리 및 예상 출력이 정상적으로 보입니다. 당신이 얻고있는 잘못된 대답은 무엇입니까? – Utsav

+0

@Utsav, 출력은 샘플 일 뿐이며 처리하지 않은 다른 테스트 사례를 찾아야합니다. hackerearth 컴파일러에서 잘못된 대답을 얻고 있습니다. 샘플 테스트 케이스가 올바르게 전달되고 있습니다. – Harsh

답변

1

소문자를 수정하고 첫 번째 문자 위치에 특수 문자를보고하는 데에만 관심이 있으므로 정규식이 아닌 ascii 비교를 사용합니다.

select name, ascii(left(name,1)), 
     case  
      when ascii(left(name,1)) between 97 and 122 then 
      concat(char(ascii(left(name,1)) - 32),substring(name,2,len(name) -1)) 
     else name 
     end name 
from t 
where ascii(left(name,1)) <= 64 or 
     ascii(left(name,1)) >= 91 
+0

65-90 아스키 코드는 대문자 A-Z 문자에 속합니다. 시원한! 사실, 귀하의 답변은 OP가 시도한 해결책에서 사용한 조합의 뉘앙스가 없습니다. +1은 SQL Server 2012 이후에'concat' 함수가 이미 있음을 알려줍니다. – RBT