2012-12-04 13 views
7

postgresql에서 isupper 또는 islower과 같은 기능을 찾지 못했습니다. 실제로 필요한 것은 표에서 모든 레코드를 선택하는 것입니다. 여기서 열 중 하나에 대문자로 된 (대문자는 제외) 단어가 들어 있습니다. 즉, 각 단어의 첫 번째 기호는 대문자이고 두 번째 기호는 소문자입니다. 단어는 모든 언어로 작성할 수 있습니다. postgresql 이후postgresql에서 charater가 대문자인지 소문자인지 확인하는 방법은 무엇입니까?

답변

13

열의 첫 번째 문자의 대소 문자가 열의 첫 번째 문자의 소문자 버전과 같지 않은 행을 선택하는 것은 어떻습니까? 같은

뭔가 :

이론적으로
SELECT * FROM table 
    WHERE SUBSTRING(col FROM 1 FOR 1) != LOWER(SUBSTRING(col FROM 1 FOR 1)) 

, 위에서뿐만 아니라 계정에 데이터베이스 캐릭터 세트/로케일을해야합니다.

+0

스마트! 나는 문자열 비교를 위해 대소 문자를 구분하지 않는 MySQL에 익숙해 져서이 이유에 대해 생각하지 않았다. – Marc

+0

이것이 내가 한 일이다. 그것은 나의 특별한 문제를 해결하는 방법이다. –

+0

@Marc : 아마도 여러분의 의견을 잘못 읽고 있습니다 만, SELECT를 게시 할 때 Postgres 인스턴스가 없기 때문에 Postgres 대신 MySQL에서 구문을 테스트했습니다 (이미 LOWER/UPPER/SUBSTRING 함수가 Postgres에서 유효합니다). 그것은 MySQL (5.1.something)에서 정상적으로 작동하여 'Abc'가 포함 된 행을 반환했지만 'xyz'가 포함 된 행은 반환하지 않습니다. – BobG

0

는 BobG의 대답은

는 또 다른 해결책이

SELECT * 
FROM yourTable 
WHERE (ascii(LEFT(yourColumn), 1) BETWEEN 65 AND 90) 
    AND (ascii(SUBSTRING(yourColumn from 2 for 1), 1) BETWEEN 97 AND 122) 

처럼 string functions

ascii을 사용하는 것이 낫다, 문자열 비교에 대한 대소 문자를 구별 때의 65 사이에 90 그건 대문자는 내가 연결된 ascii 테이블에서 볼 수 있듯이

97에서 122 사이의 소문자

+0

이 솔루션은 좋고, 러시아어, 중국어 및 기타 비 ASCII 언어에서는 작동하지 않습니다.) –

7

당신은 당신의 특정 조건을 테스트 할 Postgres regexp을 사용할 수 있습니다 : 두 번째 문자 대신 비 대문자의 소문자 알파해야하는 경우가 E'^[[:upper:]][[:lower:]]'을 사용할 수

select * from sample 
where col ~ E'^[[:upper:]][^[:upper:]]' 

.

0

당신은 문자열이 다음 상단 기능 [위 (mystr) = mystr]를 사용하여 하나 이상의 소문자가 포함되어 있는지 여부를 알고 싶은 경우 :

dbname=> select upper('AAbbCC')='AAbbCC'; 
?column? 
---------- 
f 
(1 row) 

dbname=> select upper('AABBCC')='AABBCC'; 
?column? 
---------- 
t 
(1 row) 

당신은 확인하기 위해 같은 논리를 사용할 수 있습니다 문자열에 lower() SQL 함수가있는 하나 이상의 대문자가 포함되어 있음을 나타냅니다.

더 복잡한 패턴의 경우 이전 답변에서 제안한 것처럼 정규 표현식이나 하위 문자열을 사용해야합니다.