it-swarm-ko.tech

SQL을 선택하면 ... 그럼요?

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 (_SQLServer 2012)는 access 에서 사용할 수있는 IIF 문을 추가합니다 ( Martin Smith 에 의해 지적됨)

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

Case 문은이 상황에서 친구이며 두 가지 형식 중 하나를 취합니다.

간단한 경우 :

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>

정말 멋진 주문을 위해서는 order by 절에 case 문을 넣을 수도 있습니다.

301
Jonathan

SQL Server 2012에서는 IIFfunction 을 사용하여이 작업을 수행 할 수 있습니다.

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

이것은 사실 CASE을 작성하는 (표준이 아님에도 불구하고) 단순한 축약 방법입니다. 

확장 된 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

Power of SQL CASE 문, 그리고 당신이 사용할 수있는 문장이 ( 4guysfromrolla 에서) 같을 것이라고 생각합니다. 

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

CASE를 사용하십시오. 이 같은.

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

링크 에서 우리는 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에 충분하지 않습니까?

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 서버의 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에서 IIF (우리가 간단히 사용할 수있는) 새로운 기능이 추가되었습니다.

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

working demo보기 : MSSQL 에없는 경우

시작하려면 선택한 조건에 대해 truefalse 값을 계산해야합니다. 다음은 두 개의 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
Robert B. Grossman

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
SURJEET SINGH Bisht

SQL Server 2012를 사용하는 사용자의 경우 IIF는 Case 문 대신 추가되고 작동하는 기능입니다.

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

선택 캐스트 (Obsolete = 'N'또는 InStock = 'Y'이후 ELSE 0 END AS 비트)를 판매 가능, * 제품에서

0
gii96

실제로 구현하려면 두 가지 방법이 있습니다.

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 (Obsolete = 'N'OR InStock = 'Y'? 1 : 0) AS 판매 가능, * 제품

ANSI : p.Obsolete = 'N'또는 p.InStock = 'Y'일 경우 1을 선택하고 다른 경우 0은 판매 가능, p. * FROM Product p;

별칭 (이 경우 p)을 사용하면 문제를 예방하는 데 도움이됩니다.

0
David Cohn