[MS-SQL] Rand() 함수 팁(여러데이터 호출시 난수발생) SQL

a      b       c       random_num
-----------------------------
1      1       1           4  
2      2       2           1
3      3       3           2
.       .        .           .

위와 같이 테이블의 데이터와 함께 일정 범위의 랜덤한 숫자를 함께 가져오는 데이터가 필요할때가
있습니다.

그래서 아래와 같이 SQL쿼리문을 날립니다.
SELECT a, b, c, CONVERT(INT, RAND() * 5) AS random_num
FROM tableName

a      b       c       random_num
-----------------------------
1      1       1           3  
2      2       2           3
3      3       3           3
.       .        .           .

하지만 결과는 위와 같이 동일한 값이 중복되어 나오게 됩니다.

이것은 select 시에 rand() 함수를 한번만 실행을 하게되어서 이렇게 나오는데
이것을 해결하기 위해서는 사용자정의함수를 사용하시면 됩니다.
/* Error */
CREATE FUNCTION dbo.rndNum(@i INT)
RETURNS INT
AS
BEGIN
  DECLARE @result INT;
  SET @result = CONVERT(INT, RAND() * @i)
  RETURN(@result);
END

이와 같이 사용자정의함수를 구현한 후 생성버튼을 누르면
rand()의 사용이 잘못되었다면서 또 다시 에러만...ㅡㅡ;

rand() 함수는 대표적인 비확정적함수로서 사용자정의함수에 직접사용이 불가능하기 때문이라는군요.
하지만 여기까지 왔는데 좌절할수는 없겠죠.^^

이럴경우 뷰를 하나 만든 후 뷰에서 값을 받아온후 그 값으로 사용자정의 함수를 생성하는 꼼수를 사용해보겠습니다.

1. 일단 난수를 리턴하는 뷰를 생성합니다.
CREATE VIEW dbo.rand_view
AS
SELECT RAND() AS random_num

2. 1에서 만든 뷰를 사용자정의 함수에서 사용
CREATE FUNCTION dbo.rndNum(@i INT)
RETURNS INT
AS
BEGIN
  DECLARE @result INT;
  SELECT @result = CONVERT(INT, RAND() * @i)
  FROM dbo.rand_view;
  RETURN(@result);
END

3. 위에서 만든 사용자정의 함수를 쿼리문에 사용
SELECT a, b, c, dbo.rndNum(5) AS random_num
FROM table_name

a      b       c       random_num
-----------------------------
1      1       1           4  
2      2       2           1
3      3       3           2
.       .        .           .

잘 나오는군요^^
감사합니다^^

출저:http://huhlog.tistory.com/entry/MS-SQL-Rand-%ED%95%A8%EC%88%98-%ED%8C%81%EC%97%AC%EB%9F%AC%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%B8%EC%B6%9C%EC%8B%9C-%EB%82%9C%EC%88%98%EB%B0%9C%EC%83%9D


덧글

  • 아리울 2018/07/04 09:16 # 삭제 답글

    2번이 잘못 기입된 부분있습니다


    SELECT @result = CONVERT(INT, RAND() * @i)

    이라고 되어있는데 이렇게되면 동일하게 오류가 나므로 아래와 같이 수정해야합니다.

    SELECT @result = CONVERT(INT, random_num * @i)


    입니다

댓글 입력 영역