2012-02-22 5 views
3

premisis이라는 테이블이있는 SQL 데이터베이스가 있습니다. 가장 높은 행을 선택하고 싶습니다. premisisnumber.SELECT MAX가 잘못된 값을 반환합니다.

이것은 내가 사용하고있어 SQL은 다음과 같습니다

SELECT max(premisisnr) AS premisisnr FROM premisis 

문제는, SQL 서버가 잘못된 값을 반환합니다! 내 테이블에 premisisnumber으로 행이 있지만 위의 SQL 문을 사용하면 premisisnumber 행을 반환합니다.

왜? 또한 어떻게 해결할 수 있습니까?

+2

테이블 데이터를 표시하십시오. MAX()는 최대 값을 반환합니다. 게시하지 않은 WHERE 절이 있습니까? –

+1

해당 열은 어떤 유형으로 선언됩니까? – MarcinJuraszek

+6

컬럼의 데이터 타입은'CHAR'입니다. 숫자 형 (정수)으로 변경하십시오. –

답변

14

premisisnr은 숫자 값이 아니고 char 또는 varchar 값인 것처럼 들립니다. SQL Server는 숫자 값이 아닌 문자열을 기준으로 정렬됩니다. 따라서 캐릭터가 1 인 9가 캐릭터로 등장하기 때문에 10이 9 앞에옵니다.

이상적인 해결 방법은 premisisnr 필드를 int 또는 numeric 값으로 변경하는 것입니다. 그 옵션이없는 경우, 당신이 할 수있는 다음 :

premisisnr는 정수 값 인 경우 : premisisnr는 진수 값 인 경우

select max(cast(premisisnr as int)) as premisisnr from premisis 

, 당신은 정밀도 소수로 캐스팅해야합니다가와 당신이 필요로하는 규모.

+0

+1) 컬럼 데이터 타입이 변경 될 수 없다면 where 절 (특정 숫자 타입에 대해 신뢰할 수없는 ISNUMERIC()을 제외하고)을 언급하는 것이 현명 할 것 같다. 그 열로 들어가는 쓰레기를 오류를 일으키는 것으로부터 제거하거나, 처음에는 쓰레기를 막을 수있는 검사 제약을 피할 수 있습니다. –

+0

매우 유용한 점. 저의 경험에 따르면 때때로 열을 변경할 수없는 이유는 일부 응용 프로그램은 해당 데이터 형식으로 데이터 바인딩되어 있기 때문에 문자 가비지가 없을 수도 있지만 응용 프로그램 계층에서 다른 제약이 발생할 수 있습니다. – mjsalinger

+0

물론 응용 프로그램이 모든 광고를 중지 할 수는 없습니다. 임시 난센스 그게 계속 될지도 몰라. 데이터로부터 하나의 계층까지도 제약 조건을 결코 믿지 않습니다 (사용자가 제약 조건/트리거 등을 비활성화 할 수 있도록 허용하지 않습니다 :-)). –

0

문자 데이터 유형 (char, nchar, varchar 등)이있는 것 같습니다.

숫자 입력란의 최대 값을 올바르게 가져 오려면 숫자 입력란을 사용해야합니다. int

데이터 형식을 int로 변경하면 MAX()가 작동합니다.

관련 문제