programing

SQL에 if-then-else 논리가 있습니까?

easyjava 2023. 5. 4. 20:41
반응형

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에서 이런 작업을 어떻게 수행해야 합니까?유사 if를 위해 어떤 종류의 CASE-문을 사용합니까?조합이나 다른 똑똑한 일을 하나요?

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

테스트할 SQL Fiddle입니다.

또는 모든 것을 하나로 결합할 수 있습니다.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;

다른 SQL Fiddle입니다.

이것이 다음에 도움이 되는지 확인하십시오.

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

반응형