web-dev-qa-db-ja.com

SQL SELECTでIF ... THENを実行する方法を教えてください。

IF...THENステートメントでSQL SELECTを実行するにはどうすればよいですか?

例えば:

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

CASEステートメントはSQLのIFに最も近いステートメントであり、SQL Serverのすべてのバージョンでサポートされています。

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

結果をブール値にしたい場合はCASTを実行するだけです。もしintに満足していれば、これはうまくいきます: 

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

CASEステートメントは他のCASEステートメントに埋め込むことができ、さらに集計に含めることもできます。 

SQL Server Denali(SQL Server 2012)は access :で利用可能な _ iif _ ステートメントを追加しています( Martin Smith が指摘)

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

Case文はこの状況であなたの友人であり、そして2つの形式のうちの1つを取ります:

簡単な例:

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

拡張ケース

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

Case文をorder by句に入れて、本当に素敵な順序にすることもできます。

301
Jonathan

SQL Server 2012以降では、 IIFfunction を使用できます。

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

これは事実上CASEを書くための(標準的なSQLではないにしても)単に簡略化された方法です。 

拡張されたCASEバージョンと比べると簡潔さが好きです。

IIF()CASEはどちらもSQL文内の式として解決され、明確に定義された場所でのみ使用できます。 

CASE式を使用して Transact-SQLステートメント、ステートメントブロック、ユーザー定義関数、およびストアドプロシージャの実行の流れを制御することはできません。

これらの制限によってニーズを満たすことができない場合(たとえば、条件によっては異なる形状の結果セットを返す必要がある場合)、SQL Serverには手続き型の IF キーワードもあります。

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

このアプローチではパラメータの盗聴問題を回避するように注意する必要があります。

236
Martin Smith

SQLのCASE文の威力にいくつかの良い例があります、そしてあなたが使うことができる文はこのようになると思います( 4guysfromrolla から): 

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

使用事例。このようなもの。

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

この link から、IF THEN ELSET-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' 

T-SQLにはこれで十分ではありませんか?

41
Ken

Microsoft SQL Server(T-SQL)

一部の用途では:

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

Where句では、次のように使用します。

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

SQL Serverの単純なif-elseステートメント

DECLARE @val INT;
SET @val = 15;

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

GO

SQLサーバー内の入れ子になったIf ... elseステートメント -

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では、新しい機能 _ of _ (簡単に使用できます)が追加されました。

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

ピュアビットロジックを使用します。

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

実用的なデモを参照してください:MSSQLのケースがなければ

まず始めに、選択した条件に対してtruefalseの値を計算する必要があります。これが2つ来る _ nullif _

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

一緒に結合すると1または0になります。次に ビット演算子 を使用します。

それが最も _ wysiwyg _ の方法です。

23
Tomasito

CASE文を使用します。

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

これは答えではなく、私が働いている場所で使用されているCASEステートメントの単なる例です。ネストされたCASE文があります。今、あなたは私の目が交差している理由を知っています。 

 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

あるテーブルから別のテーブルに結果を転送するのではなく、初めてテーブルに結果を挿入する場合、これは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

CASEステートメントテーブル駆動型アプローチの代替ソリューションとして使用できます。

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 

結果:

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を使用するユーザーにとって、IIFは追加された機能であり、Caseステートメントの代わりとして機能します。

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

販売可能としてCASTを選択(廃止= 'N'またはInStock = 'Y'の場合はCASE WHERE = 0)

0
gii96

これを実際に実装するには、2つの選択肢があります。

1)SQL 2012から導入されたIIFを使用します。

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

2)Select Caseを使う

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

質問... SELECT IF(廃止= 'N' OR InStock = 'Y'?1:0)AS販売可能、* FROM製品から

ANSI:p.Obsolete = 'N'またはp.InStock = 'Y'の場合は大文字と小文字を選択し、1またはそれ以外の場合0は販売可能として終了します。

エイリアス(この場合はp)を使用すると、問題を防ぐのに役立ちます。

0
David Cohn