Computer/Program

[informix] Order by 절 랜덤 정렬 처리하기

ICARUS㈜ 2013. 1. 8. 18:00
반응형

[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도 이런거 하나 만들어주면 안될까요...