[SQL] 나는 조건을 조인에 CASE 문을 사용할 수 있습니까?
SQL나는 조건을 조인에 CASE 문을 사용할 수 있습니까?
다음 이미지는 마이크로 소프트 SQL 서버 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 문의의를 생각한다. 누군가의 도움을 조금 설명 할 수 있습니까?
오류 메시지를 추가합니다 :
해결법
-
==============================
1.케이스 식은 절의 THEN 부에서 값을 반환한다. 당신은 thusly 히 사용할 수 있습니다 :
케이스 식은 절의 THEN 부에서 값을 반환한다. 당신은 thusly 히 사용할 수 있습니다 :
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
참고 반환 된 값, 예를 들어, 뭔가를 할 필요가 있음 그것은 당신의 문은 CASE / THEN 절의 맥락에서 이해가 어느 것도, 평등을위한 과제 나 시험의 값을 반환하려고 시도 1로 비교합니다. (부울 데이터 형식 인 경우 다음 평등에 대한 테스트는 의미가있다.)
-
==============================
2.난 당신이이 절 조인의 조건은 SQL 서버와 T-SQL CASE 문에 조인이 링크를 통해 이동하는 것이 좋습니다
난 당신이이 절 조인의 조건은 SQL 서버와 T-SQL CASE 문에 조인이 링크를 통해 이동하는 것이 좋습니다
EG
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
편집 : 코멘트를한다.
-
==============================
3.이 시도:
이 시도:
...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)
-
==============================
4.난 당신이 개 경우 문을 필요가 있다고 생각 :
난 당신이 개 경우 문을 필요가 있다고 생각 :
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
이 때문입니다:
-
==============================
5.나는 당신의 예를 가져다가 그것을 편집 :
나는 당신의 예를 가져다가 그것을 편집 :
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)
-
==============================
6.이것은 좋은 것 같다
이것은 좋은 것 같다
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
-
==============================
7.여기서 I는 두 가지 결과 세트의 차이를 비교 하였다. 이 도움이 될 수 있기를 바랍니다.
여기서 I는 두 가지 결과 세트의 차이를 비교 하였다. 이 도움이 될 수 있기를 바랍니다.
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
-
==============================
8.DonkeyKong의 예를했다.
DonkeyKong의 예를했다.
문제는 내가 선언 된 변수를 사용하는 데 필요한 것입니다. 이것은 당신이 비교할 필요가 무엇의 왼쪽과 오른쪽을 진술 수 있습니다. 이것은 다른 분야는 사용자에 의해 선택에 따라 연결해야하는 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
from https://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL의 여러 문에 가입 (0) | 2020.03.13 |
---|---|
[SQL] 왜 SQL ANSI-92 표준은 더 나은 ANSI-89을 통해 채택되지 않는 이유는 무엇입니까? (0) | 2020.03.13 |
[SQL] 저장 PL / CSV 파일로 PostgreSQL의에서 pgSQL의 출력 (0) | 2020.03.13 |
[SQL] 시스템 테이블 master..spt_values의 목적은 무엇이며, 그 값의 의미는 무엇인가? (0) | 2020.03.12 |
[SQL] MySQL은, 하나 개의 쿼리에 여러 테이블을 갱신 (0) | 2020.03.12 |