CASE 문을 JOIN 조건으로 사용할 수 있습니까?
다음 이미지는 Microsoft SQL Server 2008 R2 시스템 뷰의 일부입니다.이 이미지에서 볼 수 있듯이sys.partitions
그리고.sys.allocation_units
가치에 따라 다르다sys.allocation_units.type
이 둘을 결합하기 위해 다음과 같은 글을 씁니다.
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3)
THEN a.container_id = p.hobt_id
WHEN a.type IN (2)
THEN a.container_id = p.partition_id
END
그러나 상위 코드는 구문 오류를 나타냅니다.그 이유가...CASE
진술.누가 좀 설명해 줄 수 있어요?
오류 메시지 추가:
메시지 102, 레벨 15, 상태 1, 라인 6 '=' 근처의 구문이 잘못되었습니다.
A CASE
expression은 에서 값을 반환합니다.THEN
절의 일부입니다.다음과 같이 사용할 수 있습니다.
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
ELSE 0
END = 1
반환된 값으로 예를 들어 1과 비교해야 합니다.귀하의 문장이 할당 또는 동등성에 대한 테스트의 값을 반환하려고 했습니다. 이 두 문장은 다음 문맥에서 모두 의미가 없습니다.CASE
/THEN
절을 클릭합니다.(만약BOOLEAN
데이터형일 경우 동등성 검정이 타당합니다.)
대신 두 테이블에 모두 JOIN하고 SELECT 절에서 일치하는 데이터를 반환합니다.
SQL Server에서의 조건부 조인 링크와 JOIN ON 절의 T-SQL Case Statement를 참조할 것을 권장합니다.
예.
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id =
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
편집: 코멘트와 같습니다.
현재와 같이 가입 조건을 지정할 수 없습니다.위의 쿼리에 오류가 없는지 확인합니다.공통 컬럼을 위로 빼서 오른쪽 컬럼 값을 조건에 따라 평가합니다.
이것을 시험해 보세요.
...JOIN sys.allocation_units a ON
(a.type=2 AND a.container_id = p.partition_id)
OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)
두 가지 케이스 스테이트먼트가 필요하다고 생각합니다.
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON
-- left side of join on statement
CASE
WHEN a.type IN (1, 3)
THEN a.container_id
WHEN a.type IN (2)
THEN a.container_id
END
=
-- right side of join on statement
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
그 이유는 다음과 같습니다.
- CASE 문은 END에서 단일 값을 반환합니다.
- ON 문은 두 값을 비교합니다.
- 당신의 CASE 스테이트먼트는 CASE 스테이트먼트 안에서 비교를 하고 있었습니다.SELECT에 CASE 스테이트먼트를 넣으면 CASE 스테이트먼트가 True인지 False인지를 나타내는 부울 '1' 또는 '0'이 표시됩니다.
예를 들어 편집했습니다.
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id = (CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
ELSE NULL
END)
네, 가능합니다.여기 예가 있습니다.
SELECT a.*
FROM TableA a
LEFT OUTER JOIN TableB j1 ON (CASE WHEN LEN(COALESCE(a.NoBatiment, '')) = 3
THEN RTRIM(a.NoBatiment) + '0'
ELSE a.NoBatiment END ) = j1.ColumnName
이거 괜찮은데?
https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition
FROM YourMainTable
LEFT JOIN AirportCity DepCity ON @TravelType = 'A' and DepFrom = DepCity.Code
LEFT JOIN AirportCity DepCity ON @TravelType = 'B' and SomeOtherColumn = SomeOtherColumnFromSomeOtherTable
조건에 따라 최소 2가지 방법으로 가입할 수 있습니다.한쪽이 다른 쪽보다 빠릅니다.
declare @loopZaKosovnice int = 1
select *
from tHE_MoveItem mi
left join tHE_SetProdSt st on st.acIdent = mi.acIdent
-- slow
--join the_setitem si on si.acident = case when @loopZaKosovnice = 0 then mi.acident else st.acIdentChild end
-- two times as fast
left join the_setitem si1 on @loopZaKosovnice = 0 and si1.acident = mi.acident
left join the_setitem si2 on @loopZaKosovnice = 1 and si2.acident = st.acIdentChild
join the_setitem si on si.acident = isnull (si1.acident, si2.acIdent)
여기에서는, 2개의 다른 결과 세트의 차이를 비교했습니다.
SELECT main.ColumnName, compare.Value PreviousValue, main.Value CurrentValue
FROM
(
SELECT 'Name' AS ColumnName, 'John' as Value UNION ALL
SELECT 'UserName' AS ColumnName, 'jh001' as Value UNION ALL
SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
SELECT 'Phone' AS ColumnName, NULL as Value UNION ALL
SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
SELECT 'IsActive' AS ColumnName, '1' as Value
) main
INNER JOIN
(
SELECT 'Name' AS ColumnName, 'Rahul' as Value UNION ALL
SELECT 'UserName' AS ColumnName, 'rh001' as Value UNION ALL
SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
SELECT 'Phone' AS ColumnName, '01722112233' as Value UNION ALL
SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
SELECT 'IsActive' AS ColumnName, '1' as Value
) compare
ON main.ColumnName = compare.ColumnName AND
CASE
WHEN main.Value IS NULL AND compare.Value IS NULL THEN 0
WHEN main.Value IS NULL AND compare.Value IS NOT NULL THEN 1
WHEN main.Value IS NOT NULL AND compare.Value IS NULL THEN 1
WHEN main.Value <> compare.Value THEN 1
END = 1
Donkey Kong의 예를 들겠습니다.
문제는 선언된 변수를 사용해야 한다는 것입니다.이것은 비교해야 할 것의 왼쪽과 오른쪽을 기술할 수 있게 해줍니다.이는 사용자가 선택한 내용에 따라 서로 다른 필드를 링크해야 하는 SSRS 보고서를 지원하기 위한 것입니다.
첫 번째 대소문자는 선택 항목에 따라 필드 선택을 설정한 다음 결합에 대해 일치시켜야 하는 필드를 설정할 수 있습니다.
변수가 다른 필드에서 선택해야 하는 경우 오른쪽에 두 번째 케이스 스테이트먼트를 추가할 수 있습니다.
LEFT OUTER JOIN Dashboard_Group_Level_Matching ON
case
when @Level = 'lvl1' then cw.Lvl1
when @Level = 'lvl2' then cw.Lvl2
when @Level = 'lvl3' then cw.Lvl3
end
= Dashboard_Group_Level_Matching.Dashboard_Level_Name
언급URL : https://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition
'programing' 카테고리의 다른 글
모든 테이블, 모든 열에서 특정 값 SQL Server 검색 (0) | 2023.04.07 |
---|---|
를 저장하기 위한 올바른 SQL 유형은 무엇입니까?값이 24:00:00보다 큰 Net Timespan? (0) | 2023.04.07 |
SQL Server에 테이블이 있는지 확인합니다. (0) | 2023.04.07 |
SQL Server 2005 데이터베이스에 대한 현재 연결을 모두 끊으려면 어떻게 해야 합니까? (0) | 2023.04.07 |
MS SQL Server와 연동되는 Mac OS X용 SQL 클라이언트 (0) | 2023.04.07 |