it-swarm-tr.com

SQL SELECT'te IF ... THEN nasıl gerçekleştiririm?

IF...THEN ifadesinde bir SQL SELECT öğesini nasıl yaparım?

Örneğin:

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

CASE deyimi, SQL'de IF'ye en yakın olan ve SQL Server'ın tüm sürümlerinde desteklenir

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

CAST işlevini yalnızca sonucu bir boolean değeri olarak kullanmak istiyorsanız, int işlevinden memnunsanız, bu işe yarar: 

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

CASE deyimleri diğer CASE deyimlerine gömülebilir ve hatta toplamalara dahil edilebilir. 

SQL Server Denali (SQL Server 2012), access içinde de bulunan IIF ifadesini ekler ( - Martin Smith ile işaret)

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

Vaka ifadesi bu durumda arkadaşınızdır ve iki formdan birini alır:

Basit vaka:

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

Genişletilmiş dava:

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

Sen gerçekten süslü sipariş için fıkra ile vaka beyanlarını bile bir sıraya koyabilirsiniz.

301
Jonathan

SQL Server 2012'den bunun için IIF function kullanabilirsiniz.

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

Bu etkili bir şekilde sadece standart bir SQL olmasa da) CASE yazmanın yoludur. 

Genişletilmiş CASE sürümü ile karşılaştırıldığında özlü olması tercih ederim.

Hem IIF() hem CASE, bir SQL Beyanı içindeki ifadeler olarak çözümlenir ve yalnızca iyi tanımlanmış yerlerde kullanılabilir. 

CASE ifadesi, Yürütme akışını kontrol etmek için kullanılamaz. Transact-SQL deyimleri, deyim blokları, kullanıcı tanımlı işlevler ve saklı prosedürler.

İhtiyaçlarınız bu sınırlamaların yerine getirilememesi durumunda (örneğin, bazı koşullara bağlı olarak farklı şekilli sonuç kümeleri döndürme ihtiyacı), SQL Server ayrıca bir yordam IF Anahtar Kelimesi de içerir.

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

Bununla birlikte, bu yaklaşımla ilgili parametre koklama sorunlarını önlemek için bazen dikkatli olunmalıdır.

236
Martin Smith

Güzel örnekler bulabilirsiniz SQL CASE İFADELERININ G&UUML;C&UUML; ve bence kullanabileceğiniz ifadesinin şunun gibi olacağını düşünüyorum (from 4guysfromrolla ): 

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

CASE kullanın. Bunun gibi bir şey.

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

Bundan link 'in IF THEN ELSE içindeki T-SQL' u anlayabiliyoruz:

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' 

Bu T-SQL için yeterince iyi değil mi?

41
Ken

Microsoft SQL Sunucusu (T-SQL)

Seçilmiş bir kullanımda:

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

Burada bir cümlede, şunu kullanın:

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

SQL Server'da basit if-else ifadesi:

DECLARE @val INT;
SET @val = 15;

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

GO

Nestli If ... sql sunucusunda else ifadesi -

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

SQL Server 2012'de IIF (basitçe kullanabileceğimiz) yeni bir özellik eklendi:

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

Saf bit mantığı kullanın:

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

Bkz. çalışma demosu: MSSQL'DE VAKA OLMADIĞINDA

Başlangıç ​​için, seçilen şartlar için true ve false değerlerini hesaplamanız gerekir. İşte iki geliyor NULLIF :

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

birlikte 1 veya 0 verir. Bir sonraki kullanım bitwise operatörleri .

En WYSIWYG yöntemidir.

23
Tomasito

Bir CASE ifadesi kullanın:

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

Bu bir cevap değil, çalıştığım yerde kullanılan bir CASE ifadesinin bir örneği İç içe geçmiş bir CASE deyimi vardır. Artık gözlerimin neden geçtiğini biliyorsun. 

 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

Sonuçları bir tablodan diğerine aktarmak yerine bir tabloya ilk kez sonuçlar ekliyorsanız, bu durum Oracle 11.2g'de çalışır:

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

CASE deyimine alternatif bir çözüm olarak tablo güdümlü yaklaşım kullanılabilir.

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 

Sonuç:

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

SQL Server 2012 kullananlar için, IIF eklenmiş ve Case deyimlerine alternatif olarak çalışan bir özelliktir.

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

CAST SELAST (SEÇENEBİLEN CASE = 'N' veya INStock = 'YER OLARAK O SONU Bittiğinde Bitir) = Satılabilir olarak *

0
gii96

Bunun gerçekten uygulanması için iki seçeneğiniz olabilir:

1) SQL 2012'den tanıtılan IIF'yi kullanmak:

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

2) Select Case Kullanarak:

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

Soru ... IF SELECT (Eski = 'N' OR InStock = 'Y'? 1: 0) Satılabilir, AS * Üründen

ANSI: p.Obsolete = 'N' veya p.InStock = 'Y' sonra 1 0 0 Satılabilir olarak bittiğinde durumu seçin, p.

Takma adların kullanılması - bu durumda p - sorunların önlenmesine yardımcı olur.

0
David Cohn