SQL Case 문으로 선택할 테이블을 동적으로 변경
-
20-08-2019 - |
문제
저장된 절차를 작성하려고 노력하고 있으며 특정 열 값에 따라 선택한 테이블을 변경할 수 있기를 원합니다. 나는 예를 들어 보려고 노력할 것이다 :
SELECT ItemNumber,
ItemType,
Description
FROM
CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END
WHERE
CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END
보시다시피, 내가 선택한 테이블을 동적으로 바꾸는 것뿐만 아니라이 두 테이블은 두 명의 다른 사람들에 의해 두 번 다른 시간에 만들어 졌기 때문에 열 이름도 다릅니다.
따라서 내 질문은 SQL Server가 제작 한 쿼리를 좋아하지 않기 때문에 이것을 달성하는 가장 좋은 방법은 무엇입니까?
내가하려는 것을 보는 사람이라면 누구나 더 나은 방법을 제안 할 수 있다면, 나는 모든 귀가 될 것입니다 :-)
해결책
COSE에서 CASE 문을 사용할 수는 없지만 다음을 대신 사용할 수 있습니다.
SELECT itemnumber, itemtype, description
FROM tablea
WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
FROM tableb
WHERE partnumber = @itemnumber AND itemtype <> 'A'
다른 팁
동적 SQL 문을 문자열로 구축 한 다음 sp_executesql 저장 프로 시저를 호출하여 문자열을 실행할 수 있습니다.
보다 여기 자세한 정보 및 예를 보려면.
왜 당신이 하나의 SQL 문으로 일을하고 싶은지 잘 모르겠습니다. 나는 SQL Server 사람이 아니지만 Oracle 저장 절차에서는 다음과 같은 글을 쓸 수 있습니다.
If itemtype = 'A'
Then
<statement for table A>
Else
<statement for Table B>
End if
이와 같은 것이 SQL Server에서도 작동해야합니다. 누군가가 이것에 대해 확장 할 수 있습니까?
당신은 정말로 어디에 있는지 설명하지 않습니다 ItemType
오고 있습니다. 제안 된대로 UNION
단순히 두 개의 테이블을 결합하는 경우 적용 할 수 있습니다.
다음은 문제와 관련된 또 다른 가능성이 있습니다.
SELECT ItemNumber,
ItemType,
COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
ON Items.ItemType = 'A'
AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
ON Items.ItemType <> 'A'
AND TableB.ItemNumber = Items.ItemNumber
Union 쿼리를 사용하여 먼저 테이블에 가입 한 다음 선택하는 것이 좋습니다.
또한 테이블 중 하나에 대한 뷰를 만드는 것을 고려할 수 있으므로 테이블을 바꾸는 동안 필요한 열만 가져온 다음 Union을 선택한 다음 노조에서 선택합니다.
또는 임시 테이블을 사용하여 각 쿼리에서 결과를 저장하십시오. 임시 테이블의 생성을 케이스에 넣습니다 (Pseudocode, 테스트되지 않음) :
CASE @itemType
WHEN 'A'
SELECT ACol1 AS Col1, ACol2 AS Col2
FROM TABLE_A
INTO #tempTable
WHERE ItemNumber = @itemNumber
ELSE
SELECT BCol1 AS Col1, BCol2 AS Col2
FROM TABLE_B
INTO #tempTable
WHERE PartNumber = @itemNumber
END
SELECT * FROM #tempTable