CASE 문에서 임의로 생성 된 값이 NULL을 반환합니다.

이 게시물 에 따르면 SQL Server에서 임의의 값을 생성하는 올바른 방법은 다음과 같습니다.

ABS(CHECKSUM(NewId())) % 14   -- Returns a value between 0 and 13

그러나 다음과 같은 case 문에서이 표현식을 사용하는 경우 :

SELECT
    CASE ABS(CHECKSUM(NEWID())) % 4 
        WHEN 0 THEN 'String A' 
        WHEN 1 THEN 'String B' 
        WHEN 2 THEN 'String C' 
        WHEN 3 THEN 'String D'
    END AS RandomString -- Returns String A, B, C, D and NULLs.
FROM sys.all_objects

SQL fiddle 에서 볼 수 있듯이 outputtet RandomString 열에는 일부 NULL이 포함되어 있습니다 . 출력에서 NULL을 피하기 위해 무작위 표현식을 CTE에 래핑 할 수 있음을 발견했지만 위의 코드가 NULL을 반환하는 이유가 궁금합니다.

WITH RandomNumber AS (
    SELECT ABS(CHECKSUM(NEWID())) % 4 AS N FROM sys.all_objects
)
SELECT TOP 100
    CASE N
        WHEN 0 THEN 'String A' 
        WHEN 1 THEN 'String B' 
        WHEN 2 THEN 'String C' 
        WHEN 3 THEN 'String D'
    END AS RandomString -- Does not return any NULLs. Only String A, B, C and D.
FROM RandomNumber

약간 다른 방법을 사용하여 난수를 생성하려고 시도했지만 결과는 동일합니다.

CAST(RAND(CHECKSUM(NEWID())) * 4 AS INT)  -- Returns a value between 0 and 3

이것은 SQL Server 2014에서 문제인 것 같습니다. 다른 버전에서는 테스트하지 않았습니다.

Damien_The_Unbeliever

NULL특정 표현식이 평가되는 횟수에 대한 보장이 없기 때문에 s를 생성 합니다.

원하는 것은 SQL Server가 다음과 같은 작업을 수행하는 것입니다.

let x = GenerateRandomNumber()
if x = 1 then 'String 1'
if x = 2 then 'String 2'
if x = 3 then 'String 3'
if x = 4 then 'String 4'

(여기서 GenerateRandomNumber()이다 ABS(CHECKSUM(NEWID())) % 4); 하지만 SQL Server가 실제로 한 일은 다음과 같습니다.

if GenerateRandomNumber() = 1 then 'String 1'
if GenerateRandomNumber() = 2 then 'String 2'
if GenerateRandomNumber() = 3 then 'String 3'
if GenerateRandomNumber() = 4 then 'String 4'

따라서 NULL하나의 특정 비교 작업에 대해 올바른 난수를 선택하는 경우 에만 결과 가 나타나지 않습니다.

CTE를 사용하더라도 SQL Server가 위의 두 번째 코드 블록과 같은 것을 생성하지 않을 것이라는 보장 은 없습니다. 안정된 , 생성 된 임의의 숫자 를 원하면 해당 값을 어딘가에 저장 하도록 배열해야합니다 (예 : 테이블 변수 또는 임시 테이블).


내가 보장에 초점을 맞추는 이유 는 현재 관찰 된 행동을 기반으로 코드를 작성하고 싶지 않기 때문입니다. SQL Server 2008이 "순서 지정"을 중지했을 때보고 된 많은 "문제"가 우리가 TOP 100 PERCENT ... ORDER BY트릭을 사용하고있는 뷰를 생성했습니다 . 2005 및 이전 버전에서 작동했지만 작동하지 않는 현상입니다.

마찬가지로 누군가가 내 숫자를 반환하는 식을 요청하면 식을 5제공하고 DATEPART(day,GETUTCDATE())다음 8 시간 동안 원하는만큼 많은 행에 대해 쿼리를 실행하도록 할 수 있습니다. d 문제에 대한 해결책으로 권장합니다.

또한 평가 순서 에 대한 SQL Server의 결정 이 놀라 울 수있는 영역이 있다는 것도 알고 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

runSync 메서드에서 생성 된 객체의 값을 반환합니다.

c의 char []에서 문자열을 생성하면 잘못된 값이 반환됩니다.

여기 Maps API (JS) : GeoJSON로드 된 다각형이 속성 필드에 대해 null 값을 반환합니다.

Vec <u8>의 반복기에서 생성 된 요소의 이동 창을 반환합니다.

모델의 상속 된 속성이 항상 Null 값을 반환합니다.

테스트 메서드 내에서 생성 된 반환 값 (객체)을 모의합니다.

for 루프에서 생성 된 문자열을 반환합니다.

서로 생성 된 두 작업이 동일한 임의 값을 생성하는 이유는 무엇입니까?

값이 서로 다른 열의 값으로 구성된 맵인 데이터 프레임에 대한 새 열을 어떻게 생성합니까?

dplyr에서 요약하여 생성된 평균으로 한 데이터 프레임의 값을 뺍니다.

드래그 앤 드롭은 DOM에 의해 생성 된 항목에서 'null'을 반환합니다.

두 개의 다른 목록에 포함 된 값을 기반으로 데이터 프레임에 새 열을 어떻게 생성합니까?

다른 열에 제공된 값을 기반으로 pandas 데이터 프레임에 n개의 새 행 생성

Django / Python-각 객체에 할당 된 생성 된 값에서 정렬 된 목록을 반환합니다.

인덱스를 기반으로 두 개의 데이터 프레임 (피벗 테이블에서 생성 된 하나의 df)을 병합합니다.

쌍으로 구성된 벡터에서 첫 번째 값이 X와 같고 두 번째 값을 반환하는 쌍을 찾거나 Y를 반환합니다.

호출 된 메서드의 이름을 반환하는 Ruby 객체를 생성합니다.

Flutter에서 문서가 생성 된 후 새로 생성 된 문서 ID를 반환합니다.

Amazon Athena의 쿼리에서 반환 된 결과를 기반으로 알림을 생성해야합니다.

UIComponent 생성자의 getAttributes (). get ( "attributeName")이 null을 반환합니다.

ajax 요청에서 반환된 데이터로 입력 "값" 속성을 업데이트합니다... [객체, 개체]에 전달합니다. - 장고/파이썬

CASE를 기반으로 3 개 테이블간에 LEFT JOIN의 값을 조건부로 반환합니다.

임의로 생성 된 영숫자 문자열을 DynamoDB에서 기본 파티션 키 및 정렬 키로 설정하는 것이 안전합니다.

Pandas에서 지정된 값의 열 이름을 반환합니다.

Erlang에서 생성 된 프로세스에서 반환 값을 얻으려면 어떻게해야합니까?

반짝이는 모듈 안에 중첩 된`selectInput`의 값을 반환합니다.

NLP는 한 열의 값으로 그룹화 된 배열 된 Trigram 데이터 프레임을 생성합니다.

System.getProperty는 정의 된 속성에 대해 null을 반환합니다.

구문 분석 된 XML 문서에서 NodeList의 문자열 값을 반환합니다.

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    Blazor 0.9.0 및 ASP.NET Core 3 미리보기 4를 사용한 JWT 인증

  3. 3

    openCV python을 사용하여 텍스트 문서에서 워터 마크를 제거하는 방법은 무엇입니까?

  4. 4

    C # 16 진수 값 0x12는 잘못된 문자입니다.

  5. 5

    Excel : 합계가 N보다 크거나 같은 상위 값 찾기

  6. 6

    오류 : MSB4803 : MSBuild의 .NET Core 버전에서 "ResolveComReference"작업이 지원되지 않습니다.

  7. 7

    R에서 Excel로 내보낼 때 CET / CEST 시간 이동이 삭제됨

  8. 8

    node.js + postgres : "$ 1"또는 그 근처에서 구문 오류

  9. 9

    확대 후 하이 차트에서 Y 축이 잘못 정렬 됨

  10. 10

    EPPlus에서 행 높이를 설정할 때 이상한 동작

  11. 11

    Ionic 2 로더가 적시에 표시되지 않음

  12. 12

    MS Access 부분 일치 2 테이블

  13. 13

    EPPlus에서 병합 된 셀의 행 높이 자동 맞춤

  14. 14

    ExecuteNonQuery- 연결 속성이 초기화되지 않았습니다.

  15. 15

    ResponseEntity를 사용하고 InputStream이 닫히는 지 확인하는 적절한 스트리밍 방법

  16. 16

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  17. 17

    오류 : "const wchar_t *"유형의 인수가 "WCHAR *"유형의 매개 변수와 호환되지 않습니다.

  18. 18

    Java에서 이미지를 2 색으로 변환

  19. 19

    overflow-y를 사용할 때 스크롤 버벅 거림 줄이기 : scroll;

  20. 20

    Java에서 Apache POI를 사용하여 테이블 크기 및 간격을 단어로 설정하는 방법

  21. 21

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

뜨겁다태그

보관