2014-10-20 3 views
4

I가 다음 SQL 쿼리 :사용법 쿼리

SELECT id_zam AS test, 
    CASE WHEN (SELECT something FROM sth WHERE id_something = test) = 1 
      THEN 
       'true' 
      ELSE 
       'false' 
    END as test_result 
FROM testTable 

something 1. 그래서 CASE 문은 THEN 문을 실행할 것 때문에 TRUE입니다 동일 'true'

그러나 때 나는이 같은 별칭 test 주위에 작은 따옴표를 추가

SELECT id_zam AS 'test', 
    CASE WHEN (SELECT something FROM sth WHERE id_something = 'test') = 1 
      THEN 
       'true' 
      ELSE 
       'false' 
    END as test_result 
FROM testTable 

쿼리가을 반환. 왜 다른 사람들이 다른 이유를 설명 할 수 있습니까?

+2

'테스트'문자열 테스트입니다 동일한 하나의 레코드 반환하지 않습니다 - 열 이름을. –

+3

작은 따옴표는 문자열 및 날짜 상수를 정의하는 데에만 사용해야합니다. 따옴표가 없으면'test'는 열을 가리 킵니다; 따옴표 "test"는 문자열 "test"입니다. –

+1

아포스트로피와 백 틱 (키보드에서 '1'의 왼쪽)을 혼동하는 것으로 보입니다. 뒤로 틱은 열 이름을 나타 내기 위해 mysql에서 사용되며 아포 스트로피는 문자열을 나타내는 데 사용됩니다. – paqogomez

답변

3

작은 따옴표 (또는 원하는 경우 아포스트로피)는 문자열 (때로는 날짜)을 나타내지 만 정수 값은 나타내지 않습니다.

귀하의 id_something은 정수 변수라고 가정합니다. 이 경우 문자열을 정수와 비교하려고 할 때 문제가 발생합니다. 항상 false를 반환합니다.

첫 번째 예에서는 정수를 선택하고 test이라는 별칭을 지정했습니다. 비교할 때 유효한 두 정수를 비교하고 있습니다. 그러나 일단 'test'으로 변경하면 id_zam과 아무런 관련이없는 문자열이 생깁니다. 정수와 문자열을 비교하면 기본적으로 false가 반환됩니다.

편집 별칭의 경우에도 마찬가지지만 항상 그런 것은 아닙니다. 이 예에서 예 : test은 별칭이고 'test'은 문자열 리터럴이므로 다른 방식으로 처리됩니다. 그러나, MySQL 기본값에 의해 작은 따옴표는 다른 항목의 비교에 영향을 미치지 않습니다. 예를 들어 조건이 1 = '1' 인 쿼리는 true를 반환합니다. 다른 설명을 보려면이 대답의 주석을보십시오.

별명을 사용하여 비교하려는 경우 작은 인용 부호를 사용하지 말고 다시 강조하고 단순화하십시오.

+0

엄격한 모드가 활성화되어 있지 않으면, mysql은''42'' v.s에 대해 신경 쓰지 않을 것입니다. '42'. 적절한 것으로 변환됩니다. –

+0

* "... 정수를 문자열과 비교하려고합니다. 항상 false를 반환합니다."* 반드시 그런 것은 아닙니다. 기본 설치에서'1 = '1'은 항상 true를 반환합니다. –

+0

별칭에 대해서는 그렇지 않습니다. 그렇습니까? 그에 따라 대답을 편집 할 수 있습니다. – AdamMc331

-1

는이 하위 쿼리로 인해 거짓 얻을 :

SELECT something FROM sth WHERE id_something = 'test' 

1.

+1

죄송합니다. 나는 나의 질문을 편집했다. 나는'무언가'가 1과 같음을 의미했다. – XardasLord

+0

그것이 왜 틀린 것은 아니다. 레코드를 반환하지 않는 이유는 비교가 잘못 되었기 때문입니다. 이는 OP의 두 가지 예가 다른 점입니다. – AdamMc331