728x90
반응형
0. 이 글을 작성하는 이유
UUID타입을 LIKE 연산자로 패턴매칭하려고 했더니 매칭이 안되었던 일이 있어서 왜 그런가 간단하게 정리해 보기 위함
1. 사건의 경위
postgres14 사용 중
아래와 유사한 sql이 먹히지 않았다.
id like 'abed%'
에러는 이렇게 나왔다.
SQL Error [42883]: ERROR: operator does not exist: uuid ~~ unknown Hint: No operator matches the given name and argument types. You might need to add explicit type casts. Position: 41
explicit type cast를 하라고 한다. 생긴 건 비슷한데 왜 그럴까.
2. LIKE문은 어떻게 사용하라고 되어있는가? (feat RTFM)
postgres공식 문서에는 LIKE문은 아래와 같은 포맷을 가진다고 했다.
string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]
-- 예제
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false
출처: https://www.postgresql.org/docs/current/functions-matching.html
즉 앞에서 타겟이 되는 타입은 'string' 타입 이어야 한다. 하지만 우리는 사용하려는 타입이 'string'이 아니라 'uuid'타입이다.
공식적으로 postgres에서 지정한 Character Types는 아래와 같다.
타입이 애초에 맞지 않게 된다. UUID도 생긴 건 ‘string’처럼 생겼는데 결국 string이 아니고 UUID는 128비트 숫자를 16진수로 표현한 값일 뿐이다.
그래서 우리는 아래와 같이 explicit type cast를 통해 text타입으로 변환 후 like문을 사용해야 한다.
id::text like 'abed%'
그러면 좀 이상한 게 느껴질 수 있다. equals로 비교할 때는 문자열과 잘 비교가 된다.
select * from datas where id = 'f11f83dd-9a02-4f2d-9d4c-ac25ae9d8f2f'
이건 postgres에서 내부적으로 implicit type cast를 지원해 준다.
728x90
반응형
'컴퓨터공학 > 데이터베이스' 카테고리의 다른 글
PostgreSQL 9.6 성능 이야기 1장 : 아키텍처 개요 (0) | 2024.03.31 |
---|---|
postgresql9.6 성능 이야기 1장 - 아키텍처 개요를 보다가 (1) | 2024.01.27 |
postgres가 어느 날 맛이 가버렸다. postmaster는 뭐고 왜 이런 일이 발생했을까 (0) | 2024.01.20 |
PostgreSQL Materialized View 사용기 (1) | 2024.01.12 |
[PostgreSQL]Table Partitioning (1) | 2023.12.03 |