Saya dapat menggunakan pernyataan CASE dalam kondisi JOIN?

Gambar berikut ini adalah bagian dari Microsoft SQL Server 2008 R2 Pandangan Sistem. Dari gambar dapat kita lihat bahwa hubungan antara sys.partisi dan sys.allocation_units tergantung pada nilai sys.allocation_units.jenis. Jadi untuk bergabung dengan mereka bersama-sama aku akan menulis sesuatu yang mirip dengan ini:

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 

Tapi atas kode kesalahan sintaks. Saya kira bahwa's karena KASUS pernyataan. Ada yang bisa membantu untuk menjelaskan sedikit?


Tambahkan pesan kesalahan:

Msg 102, 15 Tingkat, Negara bagian 1, Baris 6 Salah sintaks dekat '='.

Mengomentari pertanyaan (7)
Larutan

KASUS ekspresi mengembalikan nilai dari KEMUDIAN bagian dari klausa. Anda bisa menggunakannya 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

Perhatikan bahwa anda perlu melakukan sesuatu dengan nilai yang dikembalikan, misalnya membandingkannya dengan 1. Pernyataan anda berusaha untuk mengembalikan nilai tugas atau ujian kesetaraan, baik yang masuk akal dalam konteks KASUS/KEMUDIAN klausa. (Jika BOOLEAN adalah datatype kemudian tes untuk kesetaraan akan masuk akal.)

Komentar (6)

Sebaliknya, anda hanya BERGABUNG untuk kedua tabel, dan anda PILIH klausa, mengembalikan data dari salah satu yang sesuai:

Saya sarankan anda untuk pergi melalui link ini Bersyarat Bergabung di SQL Server dan https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause

misalnya

    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 

Edit: Sebagai per komentar.

Anda tidak dapat menentukan kondisi join seperti yang anda lakukan.. Cek query di atas yang tidak memiliki kesalahan. Saya telah mengambil umum kolom up dan kolom kanan nilainya akan dievaluasi pada kondisi.

Komentar (9)

Coba ini:

...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)
Komentar (1)

Saya pikir anda perlu dua laporan kasus:

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             

Hal ini karena:

  • laporan KASUS mengembalikan nilai tunggal pada AKHIR
  • PADA pernyataan yang membandingkan dua nilai
  • anda KASUS pernyataan melakukan perbandingan inside laporan KASUS. Saya akan menebak bahwa jika anda menempatkan KASUS pernyataan anda PILIH anda akan mendapatkan boolean '1' atau '0' menunjukkan apakah KASUS pernyataan dievaluasi ke True atau False
Komentar (0)

Hal ini tampaknya bagus

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
Komentar (1)

Saya ambil contoh anda dan mengeditnya:

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 p.hobt_id 
           WHEN a.type IN (2)
               THEN p.partition_id
           ELSE NULL
           END = a.container_id
Komentar (0)

Mengambil DonkeyKong's contoh.

Masalah yang saya butuhkan untuk menggunakan variabel dinyatakan. Hal ini memungkinkan untuk menyatakan kiri dan sisi kanan dari apa yang anda butuhkan untuk membandingkan. Ini adalah untuk mendukung SSRS report di mana bidang yang berbeda harus dihubungkan berdasarkan pemilihan oleh pengguna.

Awal kasus ini menetapkan bidang pilihan berdasarkan pilihan dan kemudian saya dapat mengatur bidang saya perlu pertandingan untuk bergabung.

Kasus kedua pernyataan yang bisa ditambahkan untuk sisi kanan jika variabel ini diperlukan untuk memilih dari berbagai bidang

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
Komentar (0)

Di sini saya telah membandingkan perbedaan dua hasil yang berbeda set. Harapan ini mungkin bisa membantu.

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 
Komentar (0)