복붙노트

[SQL] 당신은 SQL의 경우 - 당시 다른 논리를 가질 수 있습니까? [복제]

SQL

당신은 SQL의 경우 - 당시 다른 논리를 가질 수 있습니까? [복제]

그래서 같은 우선 순위의 어떤 종류에 따라 테이블에서 데이터를 선택을 할 필요가 :

select product, price from table1 where project = 1

-- pseudo: if no price found, do this:
select product, price from table1 where customer = 2

-- pseudo: if still no price found, do this:
select product, price from table1 where company = 3

내가 = X, 나는 고객 = Y. I에 선택하지 않으 프로젝트를 기반으로 가격 3 개 제품을 발견하면 그건 그냥 결과 3 개 행을 반환하고 수행 할 수 원하는이다.

어떻게 SQL이 같은 물건을 할 예정입니까? 의사의 경우의 위해 CASE 문의 어떤 종류를 사용? 노동 조합 또는 다른 스마트 일을합니까?

편집 : MS SQL을 사용하고 있습니다.

감사!

해결법

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

    1.다음 SQL 쿼리를 만들 수 있습니다

    다음 SQL 쿼리를 만들 수 있습니다

    IF ((SELECT COUNT(*) FROM table1 WHERE project = 1) > 0) 
        SELECT product, price FROM table1 WHERE project = 1
    ELSE IF ((SELECT COUNT(*) FROM table1 WHERE project = 2) > 0) 
        SELECT product, price FROM table1 WHERE project = 2
    ELSE IF ((SELECT COUNT(*) FROM table1 WHERE project = 3) > 0)
        SELECT product, price FROM table1 WHERE project = 3
    
  2. ==============================

    2.case 문은 SQL의 IF 문에 가장 가까운, 그리고 SQL Server의 모든 버전에서 지원됩니다

    case 문은 SQL의 IF 문에 가장 가까운, 그리고 SQL Server의 모든 버전에서 지원됩니다

    SELECT CASE <variable> 
               WHEN <value>      THEN <returnvalue> 
               WHEN <othervalue> THEN <returnthis> 
               ELSE <returndefaultcase> 
           END 
      FROM <table> 
    
  3. ==============================

    3.대신에 사용하는 존재 만 사용 COUNT @@ ROWCOUNT를 :

    대신에 사용하는 존재 만 사용 COUNT @@ ROWCOUNT를 :

    select product, price from table1 where project = 1
    
    IF @@ROWCOUNT = 0
    BEGIN
        select product, price from table1 where customer = 2
    
        IF @@ROWCOUNT = 0
        select product, price from table1 where company = 3
    END
    
  4. ==============================

    4.SQL 서버를 사용하면 단지 대신 IF의 CTE를 사용할 수 있습니다 / THEN 로직은 기존의 쿼리에서지도와 관련 쿼리 수를 쉽게 변경할 수를 만들;

    SQL 서버를 사용하면 단지 대신 IF의 CTE를 사용할 수 있습니다 / THEN 로직은 기존의 쿼리에서지도와 관련 쿼리 수를 쉽게 변경할 수를 만들;

    WITH cte AS (
        SELECT product,price,1 a FROM table1 WHERE project=1   UNION ALL
        SELECT product,price,2 a FROM table1 WHERE customer=2  UNION ALL
        SELECT product,price,3 a FROM table1 WHERE company=3
    )
    SELECT TOP 1 WITH TIES product,price FROM cte ORDER BY a;
    

    로 테스트하는 SQLfiddle.

    또는, 당신은 최적화를 위해 그것을 단순화하는 하나의 선택으로 모든 것을 결합 할 수 있습니다;

    SELECT TOP 1 WITH TIES product,price FROM table1 
    WHERE project=1 OR customer=2 OR company=3
    ORDER BY CASE WHEN project=1  THEN 1 
                  WHEN customer=2 THEN 2
                  WHEN company=3  THEN 3 END;
    

    또 다른 SQLfiddle.

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

    5.이 도움이 있는지 확인하십시오 :

    이 도움이 있는지 확인하십시오 :

    select TOP 1
        product, 
        price 
    from 
        table1 
    where 
        (project=1 OR Customer=2 OR company=3) AND
        price IS NOT NULL
    ORDER BY company 
    
  6. ==============================

    6.이 경우 문입니다,하지만 난 아래 당신이 원하는 무엇을 쉽게 읽을 수 / 효율 / 더 정확하다고 생각합니다.

    이 경우 문입니다,하지만 난 아래 당신이 원하는 무엇을 쉽게 읽을 수 / 효율 / 더 정확하다고 생각합니다.

    select 
      product
      ,coalesce(t4.price,t2.price, t3.price) as price
    from table1 t1
    left join table1 t2 on t1.product = t2.product and t2.customer =2
    left join table1 t3 on t1.product = t3.product and t3.company =3
    left join table1 t4 on t1.product = t4.product and t4.project =1
    
  7. ==============================

    7.대부분의 경우 상기와 --Similar 대답. 코드 테스트에 포함

    대부분의 경우 상기와 --Similar 대답. 코드 테스트에 포함

    DROP TABLE table1
    GO
    CREATE TABLE table1 (project int, customer int, company int, product int, price money)
    GO
    INSERT INTO table1 VALUES (1,0,50, 100, 40),(1,0,20, 200, 55),(1,10,30,300, 75),(2,10,30,300, 75)
    GO
    SELECT TOP 1 WITH TIES product
            , price
            , CASE WhereFound WHEN 1 THEN 'Project'
                    WHEN 2 THEN 'Customer'
                    WHEN 3 THEN 'Company'
                ELSE 'No Match'
                END AS Source
    FROM 
        (
         SELECT product, price, 1 as WhereFound FROM table1 where project = 11
         UNION ALL
         SELECT product, price, 2 FROM table1 where customer = 0
         UNION ALL
         SELECT product, price, 3 FROM table1 where company = 30
        ) AS tbl
    ORDER BY WhereFound ASC
    
  8. from https://stackoverflow.com/questions/15085990/can-you-have-if-then-else-logic-in-sql by cc-by-sa and MIT license