IT

SQL에서 if-then-else 생식을입니까?

lottoking 2020. 9. 1. 07:42
반응형

SQL에서 if-then-else 생식을입니까? [복제]


이 질문에 이미 답변이 있습니다.

다음과 같은 우선 순위에 따라 테이블에서 데이터를 선택해야합니다.

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

즉, 가격이를 기준으로 한 제품 3 개를 찾았다면 project = X을 선택하고 싶지 않습니다 customer = Y. 결과 3 행을 반환하고 완료하고 싶습니다.

SQL에서 이와 같은 작업을 어떻게해야합니까? 의사에 대해 어떤 종류의 케이스를 사용합니까? 노조 나 다른 똑똑한 일을 나?

편집 : MS 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

CASE 문은 SQL의 IF 문에 가장 가깝고 모든 버전의 SQL Server에서 지원됩니다.

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

대신에 사용 EXISTS하고 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

SQL 서버를 사용하면 IF / THEN 논리 대신 CTE를 사용하여 기존 쿼리에서 쉽게 매핑하고 관련 쿼리 수를 설명 수 있습니다.

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최적화 프로그램을 단순화하기 위해 모든 것을 하나로 결합 할 수 있습니다 .

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 .


이것이 도움이 검증하십시오.

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

케이스가 말하는 것 같다는 것입니다.

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

-대부분 위와 대답. 테스트에 포함 된 코드

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

참고 URL : https://stackoverflow.com/questions/15085990/can-you-have-if-then-else-logic-in-sql

반응형