2017-09-25 4 views
1

저에게 작성된 저장 프로 시저가 있습니다. 절에 CASE 성명을 번역 할 수 있도록 도와 주시겠습니까?WHERE 절에서 중첩 된 CASE 문을 변환하는 방법

"So if the parameter @CompanyGuids is NOT NULL, then we are checking if table @CompanyGuidsTbl has assigned parameter and if it does - then we gonna use it, but if it does not - ??? " 

아마 다시 작성하는 방법이 : 내가 틀렸다면

--Declaring the parameter for SP 
DECLARE 
     @CompanyGuids varchar(8000) = '29634AF7-D0A2-473D-9574-405C23E10F02' 
--Declaring table variable that will contain only CompanyGuid 
DECLARE @CompanyGuidsTbl TABLE(Guid uniqueidentifier) 
    IF @CompanyGuids IS NULL 
    BEGIN 
     INSERT INTO @CompanyGuidsTbl 
     SELECT DISTINCT CompanyGuid FROM tblCompanies 
    END 
    ELSE 
    BEGIN 
     INSERT INTO @CompanyGuidsTbl 
     SELECT * FROM dbo.StringOfGuidsToTable(@CompanyGuids,',') 
    END 
--Select statement 
SELECT Col1, 
     Col2, 
     Col3 
FROM MyTable1 INNER JOIN MyTable2 
/* this is where I am confused */ 
WHERE 
     CASE WHEN @CompanyGuids IS NOT NULL 
     THEN 
     CASE WHEN tblCompanies.CompanyGuid in (SELECT Guid FROM @CompanyGuidsTbl) 
      THEN 1 ELSE 0 END 
     ELSE 1 
     END = 1 

저를 수정? 감사합니다

+0

... 누군가가 역동적 인 SQL을 피할 가능성이 있지만, 역효과를 낼 수있는 특정 단계를 거치지 않는 한 (그리고 어쨌든 성능이 손상 될 수 있음). 좀 더 이상한 점은 임시 테이블에 _all_id를 덤핑하고 있다는 것입니다. 즉, 어쨌든 방금 'JOIN'을 수행 할 수 있다는 의미입니다. 수표가없는 성명서를 사용하는 것이 좋을 것입니다. 'StringOfGuidsToTable'가 별개의 결과를 반환하지 않는 한,'JOIN'은 동일한 결과를 반환하는 것이 보장되지 않습니다. –

+0

당신이 작성한 WHERE 조건은 tblCompanies가 쿼리의 일부가 아니며 구문 상 올바르지 않기 때문에 오류를 던져야합니다. 그러나 쿼리가 더 이상 존재하지 않는다면 저에게 의미가 없습니다. 't shown ... – ZLK

+0

쓴 사람이 "@ CompanyGuids"가 NULL이면 모든 것을 선택하고, 그렇지 않으면'@ CompanyGuidsTbl'의 GUID가 tblCompanies에 있는지 확인하지만 필요합니다. tblCompanies 또는'@ CompanyGuidsTbl'가 최종 쿼리에 포함됩니다. 아니면'@ CompanyGuids' 문자열에있는 모든 GUID가 tblCompanies에 있는지 확인하고 이것이 사실이라면 결과 만 표시하려고합니까? 아니면 적어도 하나는? 실제 검색어를 보지 않고 어떤 것이 있는지 알려주지 않습니다. – ZLK

답변

2

확실하게 구문이 잘못 작성되었지만 궁극적으로 1 = 1 인 진리 문을 확인합니다. 먼저 빈 변수를 확인한 다음 변수가 비어 있지 않으면 tblCompanies의 CompanyGUID가 있는지 확인합니다 변수에 제공된리스트는 발견되면 1을 반환하고 (따라서 1 = 1이 true이므로 레코드가 일치 함) 또는 찾을 수없는 경우 (0 = 1, false 인 경우 레코드가 일치하지 않음)). 끔찍한 물건!

+0

동의하지 않았는가? 논리의 난독 화는 코딩 기술의 기장이 아닙니다. – Namphibian