MS-SQL 랜덤 row 가져오기

프로젝트를 진행할 때 TypeORM + PostgreSQL를 사용하여 개발하였는데 TypeORM + MS SQL을 사용해야하는 일이 생겼다.

 

기존에 PostgreSQL에서 테이블에서 랜덤으로 row를 뽑아 올 때는 PostgreSQL에서 random()으로 랜덤 함수를 지원해서 TypeORM createQueryBuilder에서 .getMany()나 .getOne() 앞에 .orderBy('random()')을 추가해서 ORDERBY random() 쿼리를 데이터베이스로 날렸었다.

 

아쉽게도 MS SQL에는 random과 같은 랜덤 함수를 지원하지 않았다. 대신 uuid와 같이 unique한 난수를 생성하는 함수인 newId()를 지원해서 해당 함수를 활용해서 랜덤 함수처럼 사용하여 랜덤 row를 가져올 수 있다.

 

난수가 생성된다.

 

위 이미지에서 확인할 수 있듯이 newId() 사용시 unique한 난수를 생성하는데 난수를 생성하여 orderBy를 통해 정렬하면 매번 랜덤하게 정렬이 된 row들이 리턴되게 된다.

 

해당 랜덤 정렬 방식을 TypeORM의 createQueryBuilder를 사용해서 구성하면 아래와 같다.

async getRandomUser() {
    return await this.repository.createQueryBuilder('user')
         .where('user.role = :role', { role: Role.USER })
         .orderBy('newId()')   // postgreSQL의 경우 'random()'을 사용했었다.
         .getMany();
    }

 

참고) https://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql

 

How to request a random row in SQL?

How can I request a random row (or as close to truly random as is possible) in pure SQL?

stackoverflow.com