2015-01-16 2 views
0

이 쿼리가 작동하는 데 시간이 많이 걸리고 있습니다. 기본적으로 나는 사람의 닉네임 (NickName)을 가지려면 CASE 문을 사용해야하고, 그렇지 않으면 그들의 성 (FirstName)을 사용해야합니다. 그런 다음 WHERE 문에서 위의 CASE 문에 대해 LIKE 문을 수행하십시오.SQL - WHERE에서 SELECT 별칭 사용

내가 인 경우 만 FirstName/NickName을 수행하지만 다른 열에 추가하면 작동을 멈추게 할 수있었습니다. 여기

내가 분명히 내 WHERE 절에 별칭을 사용하는 것을 시도하고 있기 때문에 위에서 작동하지 않습니다

SELECT 
    LastName 
    , Company 
    , Status 
    , CASE 
     WHEN NickName = '' THEN FirstName 
     WHEN NickName IS NULL THEN FirstName 
     ELSE NickName 
    END AS FName 
FROM database 
WHERE 
     Status = 'Active' 
    AND Company = '@Company' 
    AND FName + ' ' + LastName LIKE '%@search%' 
    OR LastName + ', ' + FName LIKE '%@search%' 

있어 것입니다. 나는

Msg 207, Level 16, State 1, Line 14 
Invalid column name 'FName'. 
Msg 207, Level 16, State 1, Line 15 
Invalid column name 'FName'. 

어떤 도움을 주시면 감사하겠습니다. 감사!

+0

RDBMS이는 무엇입니까없이 그것을 할 수 별칭을 만드는 방법? –

+0

SQL Server. 아래 답변은 저에게 효과가 있습니다! – user3320324

답변

2

공용 테이블 식 또는 하위 쿼리를 사용하여 새 결과 집합의 가상 열의 일종으로 FName을 만들 수 있습니다. 결과 집합을 일종의 가상 테이블로 사용하고 where 절의 결과 테이블에 필터를 사용할 수 있습니다.

SELECT * 
FROM (
    SELECT 
    LastName 
    , Company 
    , Status 
    , CASE 
     WHEN NickName IS NULL OR NickName = '' THEN FirstName 
     ELSE NickName 
     END AS FName 
    FROM database 
    WHERE Status = 'Active' 
    AND Company = '@Company' 
) FNames 
WHERE FName + ' ' + LastName LIKE '%@search%' 
    OR LastName + ', ' + FName LIKE '%@search%' 
+0

완벽하게 작동합니다! 나는 이것과 비슷한 것을 시도했지만 하위 쿼리에서 *를 선택하지 않았습니다. 모든 차이점을 만듭니다. – user3320324

1

사용 CROSS APPLY

SELECT LastName 
    , Company 
    , Status 
    , FName 
FROM database 
    CROSS APPLY (
     SELECT CASE WHEN NickName = '' THEN FirstName 
        WHEN NickName IS NULL THEN FirstName 
        ELSE NickName 
       END AS FName 
    ) AS CA1 
WHERE Status = 'Active' 
     AND Company = '@Company' 
     AND FName + ' ' + LastName LIKE '%@search%' 
     OR LastName + ', ' + FName LIKE '%@search%' 
1

당신은 CASE 문

SELECT * 
FROM (
    SELECT 
     LastName 
     , Company 
     , Status 
     , ISNULL(NULLIF(NickName, ''), FirstName) AS FName 
    FROM database 
    WHERE Status = 'Active' 
     AND Company = '@Company') data 
WHERE (FName + ' ' + LastName LIKE '%' + @search + '%') 
    OR (LastName + ', ' + FName LIKE '%' + @search + '%') 
+0

이 테스트하지는 않았지만 WHERE 절에서 별칭 (FName)을 사용하고 있기 때문에 작동하지 않을 것이라고 생각합니다. 그건 허용되지 않으므로 게시물의 원래 원인은 – user3320324

+0

입니다. 적어도 노크하기 전에 시도하십시오. 하위 쿼리의 별칭을 사용하고 있습니다. 원래 게시물에 하위 쿼리가 사용되지 않았습니다. 하위 쿼리의 별칭을 사용하면 완벽하게 유효합니다. – Spock

+0

B.t.w. 대답으로 받아 들인 게시물은 where 절의 별칭을 사용합니다 ... – Spock