문제

저장된 절차를 작성하려고 노력하고 있으며 특정 열 값에 따라 선택한 테이블을 변경할 수 있기를 원합니다. 나는 예를 들어 보려고 노력할 것이다 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top