2011-12-22 2 views
3

가 주어 캐스트 :T-SQL 결정적 INT는

  • SQL 서버
  • 표는 TEST_TABLE에서 TEST_TABLE
  • 열 유형의 TEST_FIELD라고 불리는 VARCHAR(50) NOT NULL
  • 행 1 : 10YR3/6
  • 행 2 : 10YR3/2
  • 쿼리 : SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

질문 :에서

내 어디 상태 나 문자열의 마지막 문자에 값을 테스트해야합니다. 나는 Where 절에서 다음과 같은 행동을한다. 경우 1

  1. RIGHT(TEST_FIELD,1) > 3
  2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3

그들이 어떤 추론 캐스트를 통해 동일한 행동을하고 있습니까? 사례 1이 결정적입니까?

미리 감사드립니다.

매트

당신은 예를 들어 값을 확인하면 변환이 이루어집니다

답변

2

: SQL 오류를 던지고없이 정수로 A2를 변환 할 수 없기 때문에

DECLARE @t varchar(100) 

SET @t = (SELECT 'ABCA2') 

SELECT @t  

IF RIGHT(@t, 2) > 10 
    SELECT 'Hi' 
ELSE 
    SELECT 'Bye' 

오류가 발생합니다.

SET @t = (SELECT 'ABC12')

변환이 성공과 비교가 될 수 위의 코드가 작동합니다

그러나 당신과 @t을 대체합니다. 올바른 함수 자체는 값을 변환하지 않습니다.

반환이 character_expression이 비 유니 코드 문자 데이터 유형 인 경우 VARCHAR : MSDN 명시 적으로 RIGHT()의 반환 형식을 말한다.

character_expression이 유니 코드 문자 데이터 유형인 경우 nvarchar를 반환합니다.

DECLARE @t varchar(100) 

SET @t = (SELECT '1') 

SELECT @t 

IF @t < 10 
    SELECT 'Hi' 
ELSE 
    SELECT 'Bye' 

공지 사항 나는 Right()에 전화를하지 않았다

는 비교가 예를 들어 텍스트가 완료되면, 모두 기능 RIGHT()을 제거, 자신에 쉽게 확인하십시오. 위의 결과는 1의 표시이고 다음 텍스트의 하이입니다.

+0

제 경우에는 값 자체에 고유 한 여러 값이 있습니다. 10YR3/6. 10, 3, 6을 사용하지 않을 것입니다. 1036? 또는 3 또는 6 대신 10을 악화시킬 수 있습니까? 그 행동에 확신 할 수 없으므로 내 질문을 계속 염두에 두십시오. –

+0

@MattAkers - 값을 각각 10, 3, 6으로 파싱 할 수 있다면 괜찮습니다. 그렇게 할 수 없다면 텍스트와 정수 데이터 유형을 비교하면 예외가 발생합니다. 10YR3/6을 말 (100)과 비교할 수 없습니다. 연산을 수행하는 방법을 알지 못하며 Right() 또는 Left()와는 아무런 관련이 없습니다. 비교와 비교할 때 전환과 더 관련이 있습니다 수행. 이게 말이 돼? – JonH

+0

그건 완벽하게 이해가됩니다. 나는 당신의 예와 의견에 완전히 동의한다. 내 질문에 대한 비교 변환이 통과/실패하는 이유는 다음과 같습니다. 1과 2 절이 동일하게 수행되는 이유는 무엇이며 1이 블랙 박스에서 캐스트를 수행하는 것처럼 보이는 경우 실제로 처리해야합니까? 그리고 절 1은 결정 론적 인 행동을합니까? –

0

그리고 대/소문자 1은 결정적입니다. 문자열에서 정수로의 암시 적 변환 (두 정수 사이의 비교를 마친 후) 또는 예외 발생.

+0

Bako에게 감사드립니다. 그게 내가 찾고 있던거야. 건배! –