2013-10-11 3 views
3

는이 같은 SELECT 절에 일시적으로 열을 만드는거야 "있는 그대로"만든 경우 :SQLite는 "그런 칼럼 없다"

SELECT *, 
     CASE WHEN a THEN 1 ELSE 0 END AS my_col 
FROM foo 

지금 내가 액세스하고 "my_col"를 사용하여 결과를 주문할 수 있습니다, 즉

SELECT *, 
     CASE WHEN a THEN 1 ELSE 0 END AS my_col 
FROM foo 
ORDER BY my_col 

그러나 나는 그렇게

SELECT *, 
     CASE WHEN a THEN 1 ELSE 0 END AS my_col, 
     my_col * 5 AS my_col_2 
FROM foo 

SQLite는 같은 열을 확장하려는 경우 "그런 칼럼 : my_col"을 생산하지 않습니다.

그래서 임시 열을 사용하여 쿼리에서 추가 용도로 사용할 수 있습니까? 전혀 가능합니까?

답변

2

당신은 하위 쿼리를 사용할 수 있습니다

SELECT X.my_col, X.my_col * 5 AS my_col_2 
FROM (
    SELECT *, CASE WHEN a THEN 1 ELSE 0 END AS my_col FROM foo 
    ) X 
ORDER BY X.my_col 

를하거나 경우 문 반복 :

SELECT *, CASE WHEN a THEN 1 ELSE 0 END AS my_col, CASE WHEN a THEN 1 ELSE 0 END * 5 AS my_col_2 FROM fo 
+0

내가를 반복하지 않도록하기 위해 열을 사용하기를 희망 바란로 새 열을 포함하는보기에 액세스 할 수 있습니다 후

CREATE VIEW IF NOT EXISTS foo_view SELECT *, CASE WHEN a THEN 1 ELSE 0 END AS my_col FROM foo 

: – Martin

0
SELECT *, CASE WHEN a THEN 1 ELSE 0 END AS my_col, CASE WHEN a THEN 1 ELSE 0 END * 5 AS my_col_2 FROM foo 
+0

빠른 답변 주셔서 감사합니다. 물론 작동하지만, 그것은 내가 취하고 싶지 않은 방식입니다. (왜냐하면 내 앱에서는 상태가 매우 커서 두 번 포함시키지 않기 때문입니다). – Martin

+0

아마도 가장 좋은 옵션은 하위 쿼리에서 사용하거나 동일한 케이스로 여러 쿼리를 사용하는 경우 아마도 당신의 삶을 단순화하기 위해 뷰를 생성 할 수 있습니다 – mucio

0

불행하게도 당신은 당신이 그것을 선언있는 정확한 순간에 별칭을 사용할 수 없습니다를 :

-- this works 
select col c   
from Table1 
order by c; 

-- this works 
select col c 
from Table1 
where c = 1; 

-- this won't 
select col c, 
     c * 2 
from Table1 
order by c; 

당신은 t 호스는 SQLFiddle입니다. 내가

SELECT *, my_col FROM foo_view 
+0

바이올린이 좋아 보인다! – Martin

1

내가보기를 만들어 내 문제를 해결 성명서. 하위 쿼리는 작동하지 않습니다. 예를 들어 my_col_2 (임시 열)가 사용되지 않았기 때문입니다. 그러나 SELECT에서 가상 열을 사용하는 것은 불가능하다는 것을 알았습니다. 그들은 WHERE 및 ORDER에서만 사용할 수 있습니다.
관련 문제