1688

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

例えば:

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

31 に答える 31

1941

この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) は、アクセスでも利用できるIIFステートメントを追加します ( Martin Smithが指摘):

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
于 2008-09-15T14:38:24.473 に答える
350

この状況では、case ステートメントが役に立ち、次の 2 つの形式のいずれかを取ります。

単純なケース:

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 句に入れることもできます。

于 2008-09-15T15:10:49.870 に答える
297

IIFSQL Server 2012から、この機能を使用できます。

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

これは事実上、(標準のSQLではありませんが)簡単な記述方法ですCASE

CASE拡張版と比べると簡潔さが好きです。

IIF()とはCASESQLステートメント内の式として解決され、明確に定義された場所でのみ使用できます。

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

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

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

ただし、このアプローチではパラメータスニッフィングの問題を回避するように注意する必要があります

于 2011-07-20T23:39:10.790 に答える
102

The Power of SQL CASE Statementsでいくつかの良い例を見つけることができます。使用できるステートメントは次のようなものになると思います ( 4guysfromrollaから):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
于 2008-09-15T14:39:49.900 に答える
79

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

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
于 2008-09-15T14:37:49.093 に答える
51
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
于 2008-09-15T14:37:44.523 に答える
49

このリンクからIF THEN ELSE、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' 

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

于 2010-01-06T01:02:08.577 に答える
49

Microsoft SQL Server (T-SQL)

では、select次を使用します。

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
于 2008-09-15T14:40:04.580 に答える
46
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
于 2008-09-15T14:37:56.673 に答える
24

CASE ステートメントを使用します。

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

etc...
于 2008-09-15T14:40:26.823 に答える
24

SQL Server 2012 では、 IIF (簡単に使用できる) という新しい機能が追加されました。

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
于 2016-04-26T15:10:54.010 に答える
22

純粋なビット ロジックを使用します。

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

動作デモを参照してください: if then without casein SQL Server

まず、選択した条件のtrueとの値を計算する必要があります。falseここに 2 つのNULLIFがあります。

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

組み合わせると 1 または 0 になります。次に、ビット単位の演算子を使用します。

これは最もWYSIWYGな方法です。

于 2013-06-08T22:21:28.753 に答える
18
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' )
于 2016-05-11T15:56:30.827 に答える
16
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
于 2015-08-25T09:44:46.240 に答える
13
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
于 2015-12-09T12:15:36.127 に答える
12

これは答えではなく、私が働いている場所で使用されている 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]
于 2016-02-11T21:35:21.910 に答える
11

あるテーブルから別のテーブルに結果を転送するのではなく、初めて結果をテーブルに挿入する場合、これはOracle11.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');
于 2012-10-26T15:30:18.990 に答える
8
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
于 2017-08-08T21:33:52.243 に答える
5

SQL Server 2012 を使用している場合、IIF は追加された機能であり、Case ステートメントの代わりとして機能します。

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
于 2014-01-08T10:18:59.093 に答える
5
SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;
于 2020-11-25T14:04:50.093 に答える
2

CASE ステートメントの使用は気に入っていますが、SQL Select で IF ステートメントを使用するように求められました。私が過去に使用したものは次のとおりです。

SELECT

   if(GENDER = "M","Male","Female") as Gender

FROM ...

これは、条件式の後に真の条件が続き、次に偽の条件がある Excel またはシートの IF ステートメントのようなものです。

if(condition, true, false)

さらに、if ステートメントをネストできます (ただし、use は CASE を使用する必要があります :-)

(注: これは MySQLWorkbench では機能しますが、他のプラットフォームでは機能しない可能性があります)

于 2020-04-09T01:31:38.797 に答える
2

完全を期すために、SQL は 3 値ロジックを使用していることを付け加えておきます。表現:

obsolete = 'N' OR instock = 'Y'

次の 3 つの異なる結果が生成される可能性があります。

| obsolete | instock | saleable |
|----------|---------|----------|
| Y        | Y       | true     |
| Y        | N       | false    |
| Y        | null    | null     |
| N        | Y       | true     |
| N        | N       | true     |
| N        | null    | true     |
| null     | Y       | true     |
| null     | N       | null     |
| null     | null    | null     |

たとえば、製品が廃止されたが、製品の在庫があるかどうかがわからない場合、製品が販売可能かどうかはわかりません。この 3 つの値を持つロジックは、次のように記述できます。

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
           ELSE NULL
       END AS saleable

仕組みがわかれば、ヌルの振る舞いを決めることで、3つの結果を2つの結果に変換できます。たとえば、これは null を販売不可として扱います。

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           ELSE 'false' -- either false or null
       END AS saleable
于 2019-11-28T10:17:11.160 に答える