Pertanyaan Bagaimana cara melakukan IF ... MAKA dalam SQL SELECT?


Bagaimana saya melakukan IF...THEN dalam sebuah SQL SELECT pernyataan?

Sebagai contoh:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product

1221
2017-09-15 14:34


asal


Jawaban:


Itu CASE pernyataan adalah yang paling dekat dengan IF dalam SQL dan didukung pada semua versi SQL Server

SELECT CAST(
             CASE 
                  WHEN Obsolete = 'N' or InStock = 'Y' 
                     THEN 1 
                  ELSE 0 
             END AS bit) as Saleable, * 
FROM Product

Anda hanya perlu melakukan itu CAST jika Anda menginginkan hasil sebagai nilai boolean, jika Anda senang dengan int, ini bekerja:

SELECT CASE 
            WHEN Obsolete = 'N' or InStock = 'Y' 
               THEN 1 
               ELSE 0 
       END as Saleable, * 
FROM Product

CASE pernyataan dapat disematkan di lain CASE pernyataan dan bahkan termasuk dalam agregat.

SQL Server Denali (SQL Server 2012) menambahkan IIF pernyataan yang juga tersedia di mengakses: (ditunjukkan oleh Martin Smith)

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product

1457
2017-09-15 14:38



Pernyataan kasus adalah teman Anda dalam situasi ini, dan mengambil salah satu dari dua bentuk:

Kasus sederhana:

SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Casing panjang:

SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Anda bahkan dapat menempatkan laporan kasus dalam pesanan dengan klausul untuk pesanan yang benar-benar mewah.


282
2017-09-15 15:10



Dari SQL Server 2012 Anda dapat menggunakan IIF fungsi untuk ini.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 

Ini secara efektif hanya cara penulisan singkat (meskipun bukan standar SQL) CASE.

Saya lebih suka keringkasan jika dibandingkan dengan yang diperluas CASE versi.

Kedua IIF() dan CASE selesaikan sebagai ekspresi dalam Pernyataan SQL dan hanya dapat digunakan di tempat yang terdefinisi dengan baik.

Ekspresi CASE tidak dapat digunakan untuk mengontrol aliran eksekusi   Pernyataan Transact-SQL, blok pernyataan, fungsi yang ditentukan pengguna, dan   prosedur tersimpan.

Jika kebutuhan Anda tidak dapat dipenuhi oleh keterbatasan ini (misalnya kebutuhan untuk mengembalikan bentuk hasil yang berbeda tergantung pada beberapa kondisi) maka SQL Server juga memiliki prosedural IF Kata kunci.

IF @IncludeExtendedInformation = 1 
  BEGIN 
      SELECT A,B,C,X,Y,Z 
      FROM   T 
  END 
ELSE 
  BEGIN 
      SELECT A,B,C 
      FROM   T 
  END 

Perawatan kadang-kadang harus diambil untuk menghindari masalah sniffing parameter dengan pendekatan ini.


213
2017-07-20 23:39



Anda dapat menemukan beberapa contoh bagus di Kekuatan Pernyataan KASUS SQL, dan saya pikir pernyataan yang dapat Anda gunakan akan menjadi sesuatu seperti ini (dari 4guysfromrolla):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees

74
2017-09-15 14:39



Gunakan CASE. Sesuatu seperti ini.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END

68
2017-09-15 14:37



SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

42
2017-09-15 14:37



 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

37
2017-09-15 14:37



Microsoft SQL Server (T-SQL)

Dalam penggunaan yang dipilih:

select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end

Di mana klausa, gunakan:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end

35
2017-09-15 14:40