>

isull을 사용할 때 (이상한 것은 아니지만 이해하지 못하는) 이상한 행동이 발생합니다. 모두 다음과 같습니다.

isnull(left(cast(null as varchar),1),0)    0 를 준다

isnull(left(cast(null as varchar),1),-1)   * 를 준다

이 행동의 이유를 알고 싶습니다.

여기에 해결 방법이 있지만

select isnull(cast(left(cast(null as varchar),1) as varchar),-1)

  • 답변 # 1

    별표의 원인은 오버플로 오류 때문입니다. 와이즈 비즈   left(cast(null as varchar),1) 를 반환합니다 . varchar(1) 내  값 ISNULL  암시 적으로 -1 로 변환됩니다 , 음수는 단일 문자로 표현할 수 없으므로 왜 varchar(1)  표시됩니다.

    와이즈 비즈로 바꾸면  그런 다음 결과를 얻으십시오 :

    '*'
    
    

    다른 메모에 차기 나쁜 습관 : (길이)없이 VARCHAR 선언

  • 답변 # 2

    LEFT(...2) 를 사용할 수 있습니다 :

    SELECT ISNULL(LEFT(CAST(NULL AS varchar),2),-1);
    
    

    DBFiddle 데모

    COALESCE  첫 번째 인수 SELECT COALESCE(left(cast(null as varchar),1),-1); 에서 데이터 유형을 유추합니다.  더 넓은 것을 유추 (데이터 유형 우선)

    ISNULL

관련 자료

  • 이전 cmake - CTest 및 CDash를 사용하여 이미지 차이 업로드
  • 다음 sql - CASE 표현식에 문자 차이가 하나만있는 경우 두 문자열을 동일하게 만드십시오