programing

IF를 실행하려면 어떻게 해야 하나요?그리고 SQL SELECT에?

mbctv 2023. 4. 6. 23:27
반응형

IF를 실행하려면 어떻게 해야 하나요?그리고 SQL SELECT에?

어떻게 해야 하나요?IF...THEN에 있어서SQL SELECT스테이트먼트?

예를 들어 다음과 같습니다.

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

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

케이스 스테이트먼트는 이 상황에서 당신의 친구이며 다음 두 가지 형식 중 하나를 취합니다.

간단한 경우:

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>

케이스스테이트먼트를절별로순서화하여정말멋있게주문할수도있습니다.

SQL Server 2012부터는 이 기능을 사용할 수 있습니다.

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

이는 사실상 (표준 SQL은 아니지만) 간략한 기술일 뿐입니다.CASE.

나는 확대된 것에 비해 간결함을 선호한다.CASE버전입니다.

둘다요.IIF()그리고.CASESQL 문 내에서 표현식으로 해결되며 잘 정의된 장소에서만 사용할 수 있습니다.

CASE 식을 사용하여 Transact-SQL 문, 문 블록, 사용자 정의 함수 및 저장 프로시저의 실행 흐름을 제어할 수 없습니다.

이러한 제한(예를 들어 조건에 따라 다른 형태의 결과 세트를 반환해야 하는 경우 등)으로 요구를 충족할 수 없는 경우 SQL Server에는 procedure 키워드도 있습니다.

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

, 이 접근방식에서는 파라미터 스니핑 문제를 피하기 위해 주의가 필요한 경우가 있습니다.

"The Power of SQL CASE Statements"에서 몇 가지 좋은 예를 찾을 수 있습니다.사용할 수 있는 문장은 다음과 같습니다(4guysfromrola에서).

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

사용 예이런 거.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

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

링크에서 우리는 이해할 수 있다.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에 충분하지 않나요?

 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

SQL Server의 간단한 if-else 문:

DECLARE @val INT;
SET @val = 15;

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

GO

SQL Server에 중첩된 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

CASE 스테이트먼트를 사용합니다.

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

etc...

SQL Server 2012에는 새로운 기능인 IIF(간단히 사용할 수 있음)가 추가되었습니다.

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

순수 비트 논리 사용:

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

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의 가장 큰 방식입니다.

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' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
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

이것은 답변이 아닙니다.제가 일하는 곳에서 사용되고 있는 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]

한 테이블에서 다른 테이블로 결과를 전송하지 않고 처음 테이블에 결과를 삽입하는 경우 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');

★★★★★★★의 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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product

이것을 실제로 실장하기 위해서는, 다음의 2개의 선택지가 있습니다.

  1. SQL Server 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
    

SQL CASE를 사용하는 것은 일반적인 If / Else 문과 동일합니다.아래 쿼리에서 사용되지 않는 값 = 'N' 또는 InStock 값 = 'Y'인 경우 출력은 1이 됩니다.그렇지 않으면 출력은 0이 됩니다.그런 다음 Salable Column 아래에 0 또는 1의 값을 입력합니다.

SELECT
      CASE
           WHEN obsolete = 'N' OR InStock = 'Y'
          THEN 1
        ELSE 0
      END AS Salable
      , *
FROM PRODUCT

질문:.

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

ANSI:

Select 
  case when p.Obsolete = 'N' 
  or p.InStock = 'Y' then 1 else 0 end as Saleable, 
  p.* 
FROM 
  Product p;

-- " " " " - "p이 경우 -- 문제를 방지하는 데 도움이 됩니다.

SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;

SQL Server 2012를 사용하는 사용자에게 IIF는 케이스 스테이트먼트 대신 추가된 기능입니다.

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

다음과 같습니다.

SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 30 THEN "The quantity is greater than 30"
    WHEN Quantity = 30 THEN "The quantity is 30"
    ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;

CASE 문의 사용은 좋지만 SQL Select에 IF 문을 입력하라는 질문이 있었습니다.지금까지 사용한 것은 다음과 같습니다.

SELECT

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

FROM ...

이는 Excel 또는 시트 IF 문과 같습니다.조건이 있고, 그 다음에 참 조건과 거짓 조건이 이어집니다.

if(condition, true, false)

, if 문을 네스트 할 수도 있습니다(단, 를 사용하면 CASE :- 를 사용할 필요가 있습니다).

(주의: MySQL Workbench에서는 동작하지만 다른 플랫폼에서는 동작하지 않을 수 있습니다.)

완전성을 위해 SQL은 3개의 값 로직을 사용합니다.표현:

obsolete = 'N' OR instock = 'Y'

다음과 같은 세 가지 뚜렷한 결과를 얻을 수 있습니다.

| 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

작동 방식을 파악한 후에는 null의 동작을 결정하여 3개의 결과를 2개의 결과로 변환할 수 있습니다.예: null은 판매 불가로 취급됩니다.

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           ELSE 'false' -- either false or null
       END AS saleable

여러 가지 조건이 있습니다.

SELECT

(CASE
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1001' THEN 'DM'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1002' THEN 'GS'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1003' THEN 'MB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1004' THEN 'MP'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1005' THEN 'PL'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1008' THEN 'DM-27'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1011' THEN 'PB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1012' THEN 'UT-2'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1013' THEN 'JGC'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1014' THEN 'SB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1015' THEN 'IR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1016' THEN 'UT-3'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1017' THEN 'UT-4'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1019' THEN 'KR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1020' THEN 'SYB-SB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1021' THEN 'GR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1022' THEN 'SYB-KP'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1026' THEN 'BNS'

  ELSE ''
END) AS OUTLET

FROM matrixcrm.Transact

언급URL : https://stackoverflow.com/questions/63447/how-do-i-perform-an-if-then-in-an-sql-select

반응형