it-swarm-id.com

Bagaimana cara melakukan JIKA ... KEMUDIAN dalam SQL SELECT?

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

Sebagai contoh:

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

Pernyataan CASE adalah yang terdekat 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 CAST jika Anda ingin hasilnya sebagai nilai boolean, jika Anda senang dengan int, ini berfungsi: 

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

Pernyataan CASE dapat disematkan dalam pernyataan CASE lainnya dan bahkan dimasukkan dalam agregat. 

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

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

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>

Kasus diperpanjang:

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

Anda bahkan dapat memasukkan pernyataan kasus dalam urutan dengan klausa untuk pemesanan yang sangat mewah.

301
Jonathan

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

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

Ini secara efektif hanya cara menulis singkat (walaupun bukan SQL standar) CASE

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

Baik IIF() dan CASE diselesaikan sebagai ekspresi dalam Pernyataan SQL dan hanya dapat digunakan di tempat yang didefinisikan 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 set hasil yang berbeda tergantung pada beberapa kondisi) maka SQL Server juga memiliki kata kunci prosedural IF .

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

Kadang-kadang harus berhati-hati untuk menghindari masalah parameter sniffing dengan pendekatan ini.

236
Martin Smith

Anda dapat menemukan beberapa contoh yang bagus di Kekuatan Pernyataan SQL CASE, 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
81
sven

Gunakan KASUS. Sesuatu seperti ini.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
73
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
46
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43
Santiago Cepas

Dari tautan ini , kita dapat memahami IF THEN ELSE dalam T-SQL:

IF EXISTS(SELECT *
          FROM   Northwind.dbo.Customers
          WHERE  CustomerId = 'ALFKI')
  PRINT 'Need to update Customer Record ALFKI'
ELSE
  PRINT 'Need to add Customer Record ALFKI'

IF EXISTS(SELECT *
          FROM   Northwind.dbo.Customers
          WHERE  CustomerId = 'LARSE')
  PRINT 'Need to update Customer Record LARSE'
ELSE
  PRINT 'Need to add Customer Record LARSE' 

Bukankah ini cukup baik untuk T-SQL?

41
Ken

Pernyataan if-else sederhana di SQL Server:

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';

GO

Pernyataan bersarang jika ... di sql server -

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
  PRINT 'what''s up?';
ELSE
  PRINT 'Bye Ravi Anand.';
END;

GO
29
Ravi Anand

Fitur baru, IIF (yang bisa kita gunakan), ditambahkan di SQL Server 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
23
sandeep rawat

Gunakan logika bit murni:

DECLARE @Product TABLE (
    id INT PRIMARY KEY IDENTITY NOT NULL
   ,Obsolote CHAR(1)
   ,Instock CHAR(1)
)

INSERT INTO @Product ([Obsolote], [Instock])
    VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')

;
WITH cte
AS
(
    SELECT
        'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
       ,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
       ,*
    FROM
        @Product AS p
)
SELECT
    'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
   ,*
FROM
    [cte] c

Lihat demo yang berfungsi: JIKA KEMUDIAN TANPA KASUS DI MSSQL

Untuk memulai, Anda perlu menghitung nilai true dan false untuk kondisi yang dipilih. Inilah dua NULLIF :

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

digabungkan bersama-sama memberikan 1 atau 0. Selanjutnya gunakan operator bitwise .

Ini adalah metode yang paling WYSIWYG .

23
Tomasito

Gunakan pernyataan KASUS:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...
22
Christopher
SELECT 1 AS Saleable, *
  FROM @Product
 WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
  FROM @Product
 WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
18
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
15
atik sarker
case statement some what similar to if in SQL server

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

Ini bukan jawaban, hanya contoh pernyataan KASUS yang digunakan tempat saya bekerja. Ini memiliki pernyataan KASUS bersarang. Sekarang Anda tahu mengapa mata saya juling. 

 CASE orweb2.dbo.Inventory.RegulatingAgencyName
    WHEN 'Region 1'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'Region 2'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'Region 3'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'DEPT OF AGRICULTURE'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
    ELSE (
            CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
                WHEN 1
                    THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
                ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
                END
            )
    END AS [County Contact Name]
12
JustJohn

Jika Anda memasukkan hasil ke dalam tabel untuk pertama kalinya, alih-alih mentransfer hasil dari satu tabel ke tabel lainnya, ini berfungsi di Oracle 11.2g:

INSERT INTO customers (last_name, first_name, city)
    SELECT 'Doe', 'John', 'Chicago' FROM dual
    WHERE NOT EXISTS 
        (SELECT '1' from customers 
            where last_name = 'Doe' 
            and first_name = 'John'
            and city = 'Chicago');
11

Sebagai solusi alternatif untuk pendekatan tabel pernyataan CASE didorong dapat digunakan.

DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10)) 
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')

SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM 
    @Product P
    LEFT JOIN 
        ( VALUES
            ( 'N', 'Y', 1 )
        ) Stmt (Obsolete, InStock, Saleable)
        ON  P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete 

Hasil:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1
9
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
8
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
6

Bagi mereka yang menggunakan SQL Server 2012, IIF adalah fitur yang telah ditambahkan dan berfungsi sebagai alternatif dari pernyataan Case.

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

PILIH CAST (KASUS KETIKA Obsolete = 'N' atau InStock = 'Y' KEMUDIAN LAIN 0 AKHIR bit) sebagai laku, * DARI PRODUK

0
gii96

Anda dapat memiliki dua pilihan untuk menerapkan ini:

1) Menggunakan IIF, yang diperkenalkan dari SQL 2012:

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

2) Menggunakan Select Case:

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

Pertanyaan ... PILIH JIKA (Usang = 'N' OR InStock = 'Y'? 1: 0) SEPERTI Dijual, * DARI PRODUK

ANSI: Pilih case ketika p.Obsolete = 'N' atau p.InStock = 'Y' lalu 1 lainnya 0 berakhir sebagai Salable, p. * DARI Produk p;

Menggunakan alias - p dalam hal ini - akan membantu mencegah masalah.

0
David Cohn