postgresql에서 isupper
또는 islower
과 같은 기능을 찾지 못했습니다. 실제로 필요한 것은 표에서 모든 레코드를 선택하는 것입니다. 여기서 열 중 하나에 대문자로 된 (대문자는 제외) 단어가 들어 있습니다. 즉, 각 단어의 첫 번째 기호는 대문자이고 두 번째 기호는 소문자입니다. 단어는 모든 언어로 작성할 수 있습니다. postgresql
이후postgresql에서 charater가 대문자인지 소문자인지 확인하는 방법은 무엇입니까?
답변
열의 첫 번째 문자의 대소 문자가 열의 첫 번째 문자의 소문자 버전과 같지 않은 행을 선택하는 것은 어떻습니까? 같은
뭔가 :
이론적으로SELECT * FROM table
WHERE SUBSTRING(col FROM 1 FOR 1) != LOWER(SUBSTRING(col FROM 1 FOR 1))
, 위에서뿐만 아니라 계정에 데이터베이스 캐릭터 세트/로케일을해야합니다.
는 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)
와 ascii을 사용하는 것이 낫다, 문자열 비교에 대한 대소 문자를 구별 때의 65 사이에 90 그건 대문자는 내가 연결된 ascii 테이블에서 볼 수 있듯이
97에서 122 사이의 소문자
이 솔루션은 좋고, 러시아어, 중국어 및 기타 비 ASCII 언어에서는 작동하지 않습니다.) –
당신은 당신의 특정 조건을 테스트 할 Postgres regexp을 사용할 수 있습니다 : 두 번째 문자 대신 비 대문자의 소문자 알파해야하는 경우가 E'^[[:upper:]][[:lower:]]'
을 사용할 수
select * from sample
where col ~ E'^[[:upper:]][^[:upper:]]'
.
당신은 문자열이 다음 상단 기능 [위 (mystr) = mystr]를 사용하여 하나 이상의 소문자가 포함되어 있는지 여부를 알고 싶은 경우 :
dbname=> select upper('AAbbCC')='AAbbCC';
?column?
----------
f
(1 row)
dbname=> select upper('AABBCC')='AABBCC';
?column?
----------
t
(1 row)
당신은 확인하기 위해 같은 논리를 사용할 수 있습니다 문자열에 lower() SQL 함수가있는 하나 이상의 대문자가 포함되어 있음을 나타냅니다.
더 복잡한 패턴의 경우 이전 답변에서 제안한 것처럼 정규 표현식이나 하위 문자열을 사용해야합니다.
스마트! 나는 문자열 비교를 위해 대소 문자를 구분하지 않는 MySQL에 익숙해 져서이 이유에 대해 생각하지 않았다. – Marc
이것이 내가 한 일이다. 그것은 나의 특별한 문제를 해결하는 방법이다. –
@Marc : 아마도 여러분의 의견을 잘못 읽고 있습니다 만, SELECT를 게시 할 때 Postgres 인스턴스가 없기 때문에 Postgres 대신 MySQL에서 구문을 테스트했습니다 (이미 LOWER/UPPER/SUBSTRING 함수가 Postgres에서 유효합니다). 그것은 MySQL (5.1.something)에서 정상적으로 작동하여 'Abc'가 포함 된 행을 반환했지만 'xyz'가 포함 된 행은 반환하지 않습니다. – BobG