2017-11-23 1 views
1

WHERE 절에서 MySQL 변수를 올바르게 사용하는 방법은 무엇입니까? column1, column2, column3 대신 대규모 쿼리가 있으므로 변수를 사용하는 것이 더 좋습니다. 내가 뭘 잘못하고 있는지 모르겠다!WHERE 절에서 MySQL 변수 사용

SELECT 
@TEST:= CASE 
    WHEN column1=1 THEN 'ONE' 
    WHEN column1=2 THEN 'TWO' 
    WHEN column1=2 THEN 'THREE' 
    ELSE 'Unknown' 
END AS test 
FROM 
    table1 
WHERE 
    @TEST= 'ONE' 
+0

을 그리고 우리는 당신이 실현하려 원하는 것을 잘 모릅니다. 우리에게 db 스키마, 샘플 데이터, 현재 및 예상 출력을 보여주십시오. \t [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t 그리고 [** 시작 **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) 질문 품질을 향상시키고 더 나은 답변을 얻는 방법을 배우십시오. \t [** 최소, 완전하고 검증 가능한 예제를 만드는 방법 **] (http://stackoverflow.com/help/mcve) –

+0

현재 쿼리에 어떤 문제가 있습니까? 어떤 오류, 잘못된 결과? –

답변

2

, 당신은 자신을 반복하지 않도록하려면 :

SELECT CASE 
    WHEN column1=1 THEN 'ONE' 
    WHEN column1=2 THEN 'TWO' 
    WHEN column1=2 THEN 'THREE' 
    ELSE 'Unknown' 
END AS test 
FROM table1 
WHERE CASE 
    WHEN column1=1 THEN 'ONE' 
    WHEN column1=2 THEN 'TWO' 
    WHEN column1=2 THEN 'THREE' 
    ELSE 'Unknown' 
END = 'ONE'; 

을 ...하지만 확실한 방법 트리거

당신은 그것을 본질적으로 동일하다이 방법을 수행 할 수 있습니다 오류 :

SELECT CASE 
    WHEN column1=1 THEN 'ONE' 
    WHEN column1=2 THEN 'TWO' 
    WHEN column1=2 THEN 'THREE' 
    ELSE 'Unknown' 
END AS test 
FROM table1 
WHERE test = 'ONE'; 

ERROR 1054 (42S22): Unknown column 'test' in 'where clause'

... 그래서 다른 프로그래밍 언어 에서처럼 변수를 사용할 수 있다는 것을 알았습니다.

SQL은 프로그래밍 언어가 아닙니다 (쿼리 언어 임). 변수는 이런 식으로 동작하지 않습니다. 일반적으로, 변수를 사용하여 코드 조각을 대체 할 수는 없습니다. 그리고 (당신의 예에서와 같이) 값을 저장하기 위해 그들을 사용하여 the manual warns로, 매우 위험하다 :이 상황에서

other than in SET statements you should never assign a value to a user variable and read the value within the same statement. [...] For other statements, such as SELECT , you might get the results you expect, but this is not guaranteed.

, 전체 표현식은 아마 갈 수있는 유일한 합리적인 방법입니다 반복. 실제 코드가 거대하고 유지 관리가 어려우면 클라이언트 언어 (PHP, Java, 기타 ...)로 동적으로 SQL을 생성 할 수 있습니다. MySQL 자체에는 dynamic SQL features이 있지만 편리하지는 않습니다.

특정 상황에서, 당신은 또한 하위 쿼리와 함께 놀 수 있지만, 성능이 때로는 고통을 수 있음을 경고 :

SELECT * 
FROM (
    SELECT CASE 
     WHEN column1=1 THEN 'ONE' 
     WHEN column1=2 THEN 'TWO' 
     WHEN column1=2 THEN 'THREE' 
     ELSE 'Unknown' 
    END AS test 
    FROM table1 
) t 
WHERE test = 'ONE'; 
1

나는 WHERE 이 (100 % 확실 상점을) 쿼리를 의미 모든 방법으로 가능하지 않다 SELECT 전에 적용 을 평가라고 생각합니다. 내가 제대로 짐작 경우

SELECT 
    column1 AS TEST 
FROM 
    table1 
WHERE 
    (column1 = 1 AND ONE = 'ONE') 
OR (column1 = 2 AND TWO = 'ONE') 
OR (column1 = 3 AND THREE = 'ONE') 
OR Unknown = 'ONE' 
+0

고맙지 만 접근법이 제 경우에는 작동하지 않습니다 ...'column1','column2','column3' 대신에 많은 쿼리가 있습니다. 왜 그런 변수를 사용하는 것이 더 낫다고 생각합니까? 하지만 내가 뭘 잘못하고 있는지 모르겠어! –

+0

어쩌면 전체 데이터베이스 스키마가 정규화되지 않았을 수도 있습니다. – DanFromGermany

관련 문제