반응형
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;
이것이 다음에 도움이 되는지 확인하십시오.
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
반응형
'programing' 카테고리의 다른 글
| ASP.NET MS11-100: 게시된 양식 값의 최대 수에 대한 제한을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.04 |
|---|---|
| Xcode 10, 명령 코드 서명이 0이 아닌 종료 코드로 실패했습니다. (0) | 2023.05.04 |
| 그래픽으로 표시할 수 없는 Excel의 외부 데이터 쿼리에 매개 변수를 추가하는 방법은 무엇입니까? (0) | 2023.05.04 |
| NSCache 사용 방법 (0) | 2023.05.04 |
| 스택 패널에서 항목 정렬? (0) | 2023.05.04 |