JOIN koşulunda CASE deyimini kullanabilir miyim?

Aşağıdaki görüntü Microsoft SQL Server 2008 R2 Sistem Görünümleri'nin bir parçasıdır. Resimden sys.partitions ve sys.allocation_units arasındaki ilişkinin sys.allocation_units.type değerine bağlı olduğunu görebiliriz. Dolayısıyla, bunları birleştirmek için şuna benzer bir şey yazardım:

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 

Ancak üstteki kod sözdizimi hatası veriyor. Sanırım bunun nedeni CASE ifadesi. Birisi biraz açıklamaya yardımcı olabilir mi?


Hata mesajı ekleyin:

Msg 102, Düzey 15, Durum 1, Satır 6 '=' yakınında hatalı sözdizimi.

Çözüm

Bir CASE ifadesi, cümlenin THEN kısmından bir değer döndürür. Bunu şu şekilde kullanabilirsiniz:

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

Dönen değerle bir şey yapmanız gerektiğine dikkat edin, örneğin 1 ile karşılaştırın. İfadeniz bir atamanın değerini döndürmeye veya eşitliği test etmeye çalıştı, bunların ikisi de CASE/THEN cümlesi bağlamında mantıklı değildir. (Eğer BOOLEAN bir veri tipi olsaydı, o zaman eşitlik testi mantıklı olurdu).

Yorumlar (6)

Bunun yerine, her iki tabloya ve SELECT cümlenize JOIN yapmanız yeterlidir, eşleşen veriyi döndürür:

Bu bağlantıyı SQL Server'da Koşullu Birleştirmeler ve https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause adresini incelemenizi öneririm.

Örneğin.

    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 

Düzenleme: Yorumlara göre.

Yaptığınız gibi birleştirme koşulunu belirtemezsiniz. Kontrol edin Yukarıdaki sorguda hata yok. Ortak sütunu yukarı çıkardım ve sağ sütun değeri koşulda değerlendirilecektir.

Yorumlar (9)

Bunu dene:

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