복붙노트

[SQL] SQL 스위치 / 케이스에 '어디서'절

SQL

SQL 스위치 / 케이스에 '어디서'절

나는 주변 검색을 시도,하지만 난 나를 도움이 될 아무것도 찾을 수 없습니다.

나는 SQL에서이 작업을 수행하기 위해 노력하고있어 :

declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
    WHEN 'location' THEN account_location = @locationID
    WHEN 'area' THEN xxx_location_area = @locationID
    WHEN 'division' THEN xxx_location_division = @locationID

나는 각각의 끝에 '= @locationID'을 넣어 필요가 없습니다 것을 알고 있지만 나는 올바른 것에 근처에도 구문을 얻을 수 없습니다. SQL은 언제 라인 처음 내 '='에 대해 불평 계속 ...

이걸 어떻게 할 수 있습니까?

해결법

  1. ==============================

    1.

    declare @locationType varchar(50);
    declare @locationID int;
    
    SELECT column1, column2
    FROM viewWhatever
    WHERE
    @locationID = 
      CASE @locationType
          WHEN 'location' THEN account_location
          WHEN 'area' THEN xxx_location_area 
          WHEN 'division' THEN xxx_location_division 
      END
    
  2. ==============================

    2.case 문이없는 ...

    case 문이없는 ...

    SELECT column1, column2
    FROM viewWhatever
    WHERE
        (@locationType = 'location' AND account_location = @locationID)
        OR
        (@locationType = 'area' AND xxx_location_area = @locationID)
        OR
        (@locationType = 'division' AND xxx_location_division = @locationID)
    
  3. ==============================

    3.여기 당신은 간다.

    여기 당신은 간다.

    SELECT
       column1, 
       column2
    FROM
       viewWhatever
    WHERE
    CASE 
        WHEN @locationType = 'location' AND account_location = @locationID THEN 1
        WHEN @locationType = 'area' AND xxx_location_area = @locationID THEN 1
        WHEN @locationType = 'division' AND xxx_location_division = @locationID THEN 1
        ELSE 0
    END = 1
    
  4. ==============================

    4.나는이 결함이 테이블 구조의 지표이다라고 말하고 싶지만. 아마도 다른 위치의 유형은 훨씬 풍부한 질의를하고 또한 주변에 불필요한 열을 피하기 위해 수 있도록, 다른 테이블에서 분리되어야한다.

    나는이 결함이 테이블 구조의 지표이다라고 말하고 싶지만. 아마도 다른 위치의 유형은 훨씬 풍부한 질의를하고 또한 주변에 불필요한 열을 피하기 위해 수 있도록, 다른 테이블에서 분리되어야한다.

    당신은 힘의 작업 아래처럼 뭔가를 구조를 변경할 수없는 경우 :

    SELECT
        *
    FROM
        Test
    WHERE
        Account_Location = (
            CASE LocationType
              WHEN 'location' THEN @locationID
              ELSE Account_Location
            END
        )
        AND
        Account_Location_Area = (
            CASE LocationType
              WHEN 'area' THEN @locationID
              ELSE Account_Location_Area
            END
        )
    

    그리고 등등 ... 우리는 즉시 쿼리의 구조를 변경할 수는 없지만 우리는 술어가 자신을 동일하게하여 재정의 할 수 있습니다.

    편집 : 위의 제안은 물론 훨씬 더의 있습니다, 단지 내를 무시합니다.

  5. ==============================

    5.이것에 대한 문제는 SQL 엔진 표현식을 평가로 진행하면,이 부분으로부터 적절한 테이블을 끌어 확인하고 부가 일부 기본 기준을 제공하는 곳, 그래서 제대로 동적 상태를 평가할 수 없다는되는 열에 에 대해 확인.

    이것에 대한 문제는 SQL 엔진 표현식을 평가로 진행하면,이 부분으로부터 적절한 테이블을 끌어 확인하고 부가 일부 기본 기준을 제공하는 곳, 그래서 제대로 동적 상태를 평가할 수 없다는되는 열에 에 대해 확인.

    당신은 당신이 같은 술어에서 WHERE 조건을 체크 할 때 WHERE 절을 사용할 수 있습니다

    WHERE account_location = CASE @locationType
                                  WHEN 'business' THEN 45
                                  WHEN 'area' THEN 52
                             END
    

    그래서 당신의 특별한 경우에, 당신이 필요 해요 저장 프로 시저로 쿼리를 넣어 또는 세 개의 쿼리를 만들 수 있습니다.

  6. ==============================

    6.OR 연산자 언제 어디 상태 케이스의 대안이 될 수있다

    OR 연산자 언제 어디 상태 케이스의 대안이 될 수있다

    ALTER PROCEDURE [dbo].[RPT_340bClinicDrugInventorySummary]
        -- Add the parameters for the stored procedure here
         @ClinicId BIGINT = 0,
         @selecttype int,
         @selectedValue varchar (50)
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SELECT
        drugstock_drugname.n_cur_bal,drugname.cdrugname,clinic.cclinicname
    
    FROM drugstock_drugname
    INNER JOIN drugname ON drugstock_drugname.drugnameid_FK = drugname.drugnameid_PK
    INNER JOIN drugstock_drugndc ON drugname.drugnameid_PK = drugstock_drugndc.drugnameid_FK
    INNER JOIN drugndc ON drugstock_drugndc.drugndcid_FK = drugndc.drugid_PK
    LEFT JOIN clinic ON drugstock_drugname.clinicid_FK = clinic.clinicid_PK
    
    WHERE   (@ClinicId = 0 AND 1 = 1)
        OR  (@ClinicId != 0 AND drugstock_drugname.clinicid_FK = @ClinicId)
    
        -- Alternative Case When You can use OR
        AND ((@selecttype = 1 AND 1 = 1)
        OR  (@selecttype = 2 AND drugname.drugnameid_PK = @selectedValue)
        OR  (@selecttype = 3 AND drugndc.drugid_PK = @selectedValue)
        OR  (@selecttype = 4 AND drugname.cdrugclass = 'C2')
        OR  (@selecttype = 5 AND LEFT(drugname.cdrugclass, 1) = 'C'))
    
    ORDER BY clinic.cclinicname, drugname.cdrugname
    END
    
  7. ==============================

    7.이 쿼리를 시도하십시오. 위 게시물에 대한 답변 :

    이 쿼리를 시도하십시오. 위 게시물에 대한 답변 :

    select @msgID, account_id
        from viewMailAccountsHeirachy
        where 
        CASE @smartLocationType
            WHEN 'store' THEN account_location
            WHEN 'area' THEN xxx_location_area 
            WHEN 'division' THEN xxx_location_division 
            WHEN 'company' THEN xxx_location_company 
        END  = @smartLocation
    
  8. ==============================

    8.이 시도:

    이 시도:

    WHERE (
        @smartLocationType IS NULL 
        OR account_location = (
             CASE
                WHEN @smartLocationType IS NOT NULL 
                     THEN @smartLocationType
                ELSE account_location 
             END
        )
    )
    
  9. ==============================

    9.

    Case Statement in SQL Server Example
    
    Syntax
    
    CASE [ expression ]
    
       WHEN condition_1 THEN result_1
       WHEN condition_2 THEN result_2
       ...
       WHEN condition_n THEN result_n
    
       ELSE result
    
    END
    
    Example
    
    SELECT contact_id,
    CASE website_id
      WHEN 1 THEN 'TechOnTheNet.com'
      WHEN 2 THEN 'CheckYourMath.com'
      ELSE 'BigActivities.com'
    END
    FROM contacts;
    
    OR
    
    SELECT contact_id,
    CASE
      WHEN website_id = 1 THEN 'TechOnTheNet.com'
      WHEN website_id = 2 THEN 'CheckYourMath.com'
      ELSE 'BigActivities.com'
    END
    FROM contacts;
    
  10. ==============================

    10.이 쿼리를 시도하십시오. 그것의 아주 쉽게 이해하기 :

    이 쿼리를 시도하십시오. 그것의 아주 쉽게 이해하기 :

    CREATE TABLE PersonsDetail(FirstName nvarchar(20), LastName nvarchar(20), GenderID int);
    GO
    
    INSERT INTO PersonsDetail VALUES(N'Gourav', N'Bhatia', 2),
                  (N'Ramesh', N'Kumar', 1),
                  (N'Ram', N'Lal', 2),
                  (N'Sunil', N'Kumar', 3),
                  (N'Sunny', N'Sehgal', 1),
                  (N'Malkeet', N'Shaoul', 3),
                  (N'Jassy', N'Sohal', 2);
    GO
    
    SELECT FirstName, LastName, Gender =
        CASE GenderID
        WHEN 1 THEN 'Male'
        WHEN 2 THEN 'Female'
        ELSE 'Unknown'
        END
    FROM PersonsDetail
    
  11. from https://stackoverflow.com/questions/206484/sql-switch-case-in-where-clause by cc-by-sa and MIT license