반응형
[informix] Order by 절 랜덤 정렬 처리하기
인포믹스는 order by 절에 랜덤으로 값을 가져올수 있는 함수가 없습니다.
대안으로 각 레코드마다 랜덤 넘버값을 주고 그 값을 기준으로 정렬하는 방법으로 처리가 가능합니다.
1. 랜덤 넘버를 생성 ( SPL 참조 : http://www.iiug.org/software/archive/random_spl)
CREATE PROCEDURE sp_setseed(n INTEGER)
DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
LET seed = n;
END PROCEDURE;CREATE PROCEDURE sp_random() RETURNING INTEGER; DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1; DEFINE d DECIMAL(20,0); LET d = (seed * 1103515245) + 12345; -- MOD function does not handle 20-digit values... Dammit!! LET seed = d - 4294967296 * TRUNC(d / 4294967296); RETURN MOD(TRUNC(seed / 65536), 32768); END PROCEDURE; |
2. SPL(sp_random) 생성후 쿼리 테스트
> select first 1 manu_code,manu_name,sp_random() as rn from manufact order by 3; manu_code manu_name rn SHM Shimara 1462 1 row(s) retrieved. > select first 1 manu_code,manu_name,sp_random() as rn from manufact order by 3; manu_code manu_name rn SMT Smith 6322 1 row(s) retrieved. > select first 1 manu_code,manu_name,sp_random() as rn from manufact order by 3; manu_code manu_name rn KAR Karsten 1645 1 row(s) retrieved. > select first 1 manu_code,manu_name,sp_random() as rn from manufact order by 3; manu_code manu_name rn NRG Norge 3784 1 row(s) retrieved. |
타 DB는 아래와 같이 rand() 나 random()를 이용해서 처리가 가능합니다.
Mysql: SELECT column FROM table ORDER BY RAND() LIMIT 1 PostgreSQL: SELECT column FROM table ORDER BY RANDOM() LIMIT 1 Microsoft SQL Server: SELECT TOP 1 column FROM table ORDER BY NEWID() IBM DB2: SELECT column FROM table ORDER BY RAND() FETCH FIRST 1 ROWS ONLY Oracle: SELECT column FROM ( SELECT column FROM table ORDER BY dbms_random.value ) WHERE rownum = 1 |
Informix DB도 이런거 하나 만들어주면 안될까요...