SQL තෝරාගැනීමේදී IF… THEN කරන්නේ කෙසේද?


1520

මම කෙසේද ඉටු කරන්නේ IF...THENතුළ සිටින SQL SELECTප්රකාශයක්?

උදාහරණයක් වශයෙන්:

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

14
ඔබට මෙම සබැඳිය බැලීමට අවශ්‍ය විය හැකිය . සම්බන්ධයෙන්: SQL WHERE වගන්ති: CASE වලින් වළකින්න, බූලියන් තර්කනය භාවිතා කරන්න
කවුරුහරි

3
@Somebody: නිසා disjunction පිළිබඳව ඇඟවුම බවට පරිවර්තනය කිරීමට තාර්කික නැවත ලිවිය නීති භාවිතා කරන ආකාරය පිළිබඳව එම ලිපිය සාකච්ඡා ඇත්තටම අදාළ නැත. හෝඩුවාව යනු 'තාර්කික' යන වචනයයි. එනම් සත්‍ය හෝ අසත්‍යය නිරාකරණය කරන දෙයක් වන අතර එය ප්‍රක්ෂේපණයට අදාළ නොවේ. TL; ඩී ලිපිය අදාළ WHEREසහ CHECKනමුත් SELECT.
onedaywhen

6
@ මාටින් ස්මිත්ගේ පිළිතුර වඩාත් අලංකාරයි - SQL 2012+ හි IIF භාවිතා කරන්න.
මුරේ ෆොක්ස්ක්‍රොෆ්ට්

Answers:


1772

මෙම CASEප්‍රකාශය SQL හි IF ට ආසන්නතම වන අතර SQL සේවාදායකයේ සියලුම සංස්කරණ සඳහා සහය දක්වයි.

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

ඔබට අවශ්‍ය වන්නේ CASTප්‍රති result ලය බූලියන් අගයක් ලෙස අවශ්‍ය නම් පමණි . ඔබ සමඟ සතුටු වන්නේ නම් 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 ප්‍රකාශය එකතු කරන අතර එය ප්‍රවේශවීමේදී ද ලබා ගත හැකිය ( මාටින් ස්මිත් විසින් පෙන්වා දී ඇත ):

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

58
නඩුව භාවිතා කරන විට අමතර පරිස්සම් සහගත වචනයක් ඔබගේ කොන්දේසි වරහන් තුළ කොටු නොකරන්න. එය වටහා ගැනීමට සෑහෙන කාලයක් ගත විය :)
අර්චන් මිශ්‍ර

17
END අමතක කරන්න එපා
සයිමන්_වීවර්

8
සහ ඒඑස් බිට්!
කැස් බ්ලූම්

8
නඩුව, කවදාද, වෙනත් හා අවසානය සමාන්තරව (එකම රේඛාව ඔස්සේ) ඇතුල් කළ යුතුය - එවිට පමණක් තවත් ඇතුළට ඇතුල් කළ යුතුය - මට වඩාත් සුදුසුය.
උජ්වාල් සිං

6
EeReeveStrife iif SQL Server 2012+
stuartdotnet

331

සිද්ධි ප්‍රකාශය මෙම තත්වය තුළ ඔබේ මිතුරා වන අතර එය ආකාර දෙකෙන් එකක් ගනී:

සරල අවස්ථාව:

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

දීර් case කළ නඩුව:

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

සැබවින්ම විසිතුරු ඇණවුම් කිරීම සඳහා වගන්තිය මඟින් ඔබට සිද්ධි ප්‍රකාශයන් ඇණවුමකට දැමිය හැකිය.


32
මෙය පරණ බව මම දනිමි, නමුත් එහි ප්‍රති column AS Col_NameEND
ලයක්

9
මට සෑම විටම දැනෙන්නේ දෙවැන්න වඩා සරල බවයි.
හොගාන්

4
එකඟ විය, මම සෑම විටම පාහේ දීර් case සිද්ධි ප්‍රකාශය භාවිතා කිරීම අවසන් කරන්නේ මට පරීක්ෂා කිරීමට අවශ්‍ය කොන්දේසි සෑම විටම එක් විචල්‍යයකට වඩා සංකීර්ණ වන බැවිනි. එය කියවීමට මට පහසු යැයි හැඟේ.
magnum_pi

1
විචල්‍යයන් සමඟ හෝ නැතිව අවස්ථා දෙකම පිළිබඳ හොඳ පැහැදිලි කිරීමක්. විචල්යය සමඟ කොන්දේසිය ප්රකාශ ප්රකාශයෙන් පසුව විචල්යය හා ඔබේ තත්වය පදනම් කරගත් විචල්යය අතර සමානාත්මතාවයක් තෘප්තිමත් කළ යුතුය, විචල්යයකින් තොරව ඔබට පරීක්ෂා කිරීම සඳහා ස්වයංපෝෂිත කොන්දේසියක් එක් කළ හැකිය.
රෙමස්.ඒ

දෙවන විකල්පය සමඟ මම වඩාත් පහසු ය. දෙක සමානව හොඳයි.
ස්ටැන්ලි ඔක්පාල නවෝසා

279

SQL Server 2012 වෙතින් ඔබට මේ සඳහා IIFශ්‍රිතය භාවිතා කළ හැකිය .

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

මෙය effectively ලදායී ලෙස කෙටිමං (සම්මත SQL නොවුනත්) ලිවීමේ ක්‍රමයකි CASE.

පුළුල් කළ CASEඅනුවාදය සමඟ සසඳන විට මම සංක්ෂිප්තභාවයට කැමැත්තෙමි .

දෙකම IIF()සහ CASESQL ප්‍රකාශයක් තුළ ප්‍රකාශන ලෙස විසඳා ගත හැකි අතර එය භාවිතා කළ හැක්කේ හොඳින් නිර්වචනය කළ ස්ථානවල පමණි.

ගනුදෙනු- SQL ප්‍රකාශ, ප්‍රකාශන වාරණ, පරිශීලක අර්ථ දක්වන ලද කාර්යයන් සහ ගබඩා කළ ක්‍රියා පටිපාටි ක්‍රියාත්මක කිරීම පාලනය කිරීමට CASE ප්‍රකාශනය භාවිතා කළ නොහැක.

මෙම සීමාවන්ගෙන් ඔබගේ අවශ්‍යතා සපුරාලිය නොහැකි නම් (නිදසුනක් ලෙස, වෙනස් හැඩයකින් යුත් ප්‍රති result ල නැවත ලබා දීමේ අවශ්‍යතාව යම් කොන්දේසියක් මත රඳා පවතී) එවිට SQL සේවාදායකයට ක්‍රියා පටිපාටික IFමූල පදයක් ද ඇත.

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

කෙසේ වෙතත් මෙම ප්‍රවේශය සමඟ පරාමිති වංචා කිරීමේ ගැටළු වළක්වා ගැනීමට ඇතැම් විට සැලකිලිමත් විය යුතුය .


6
ඔබට IF අවශ්‍ය නම් මෙය පිළිතුර විය යුතුය .. ඉන්පසු SQL හි ප්‍රකාශය.
ජේ

92

The Power of SQL CASE ප්‍රකාශන වල ඔබට හොඳ උදාහරණ කිහිපයක් සොයාගත හැකි අතර, ඔබට භාවිතා කළ හැකි ප්‍රකාශය මෙවැනි දෙයක් වනු ඇතැයි මම සිතමි ( 4guysfromrolla වෙතින් ):

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

4
බලන්න: සිත්ගන්නා සාකච්ඡාවක් සඳහා meta.stackexchange.com/questions/103053/… . ඔබ සපයන සබැඳි දෙක මම සහාය දෙන අමතර සන්දර්භයක් එක් කරමි.
සෑම් කුංකුම

2
අමතර විස්තර සඳහා යොමු කිරීම සැබවින්ම ප්‍රයෝජනවත් වන අතර බෙහෙවින් නිර්දේශිතය
baymax

75

CASE භාවිතා කරන්න. මේ වගේ දෙයක්.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END


49

Microsoft SQL සේවාදායකය (T-SQL)

A හි 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

1
ඇයි ඔබ එසේ නොකර where Obsolete = 'N' or InStock = 'Y'ප්‍රායෝගිකව අඩක් කපා දැමුවේ
නැත්තේ

47

සිට , මෙම සබැඳිය ඔස්සේ , අපි තේරුම් ගත හැක IF THEN ELSEටී 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 සඳහා මෙය ප්‍රමාණවත් නොවේද?


3
ඉල්ලුම්කරුට අවශ්‍ය වූයේ මෙය නොවේ, නමුත් තෝරාගත් ප්‍රකාශයකින් පිටත ප්‍රකාශයන් භාවිතා කළ හැකි බව දැන ගැනීම ඉතා ප්‍රයෝජනවත් වේ .
ජොනතන්

2
EXISTS හොඳයි, මන්ද එය අයිතමය සොයාගත හොත් එය සෙවුම් ලූපයෙන් ඉවත් වේ. වගු පේළි අවසානය දක්වා COUNT ධාවනය වේ. ප්රශ්නයට කිසිවක් නැත, නමුත් දැනගත යුතු දෙයක්.
JustJohn


32

SQL සේවාදායකයේ සරල if-else ප්‍රකාශය:

DECLARE @val INT;
SET @val = 15;

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

GO

SQL සේවාදායකයේ නෙස්ටඩ් නම් ... වෙනත් ප්‍රකාශයක් -

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

2
ප්‍රමාද වූ නමුත් SELECTOP ඇසූ පරිදි එය ඇතුළත භාවිතා කළ හැකිද?
abdul qayyum

25

SQL සේවාදායකය 2012 හි IIF (අපට සරලව භාවිතා කළ හැකි) නව අංගයක් එක් කරන ලදි:

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

1
මෙම පිළිතුර මීට වසර කිහිපයකට පෙර මාටින් ස්මිත් විසින් ලබා දී ඇති පිළිතුර (අඩු විස්තර සහිතව) පුනරාවර්තනය වේ .
jk7

1
k jk7 ප්‍රශ්නයට පළමු පිළිතුර මෙයයි.
sandeep rawat

3
මා දකින දෙයින් නොවේ. එයින් කියැවෙන්නේ ඔබේ පිළිතුර අප්‍රේල් 26 '16 ද මාටින්ගේ ප්‍රකාශය ජූලි 20 '11 ද ය.
jk7

24

CASE ප්‍රකාශයක් භාවිතා කරන්න:

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

etc...

23

පිරිසිදු බිට් තර්කනය භාවිතා කරන්න:

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

වැඩකරන නිරූපණයcase බලන්න : එසේ නම් SQL සේවාදායකය නොමැතිව .

ආරම්භය සඳහා, ඔබ තෝරාගත් කොන්දේසි වල වටිනාකම trueසහ වැඩ කිරීම අවශ්‍ය වේ false. මෙන්න NULLIF දෙකක් එයි :

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

එකට එකතු වී 1 හෝ 0 ලබා දෙයි. ඊළඟට බිට්වේස් ක්‍රියාකරුවන් භාවිතා කරන්න .

එය වඩාත්ම WYSIWYG ක්‍රමයයි.


19
-1 කේත අපැහැදිලි කිරීම සඳහා. බරපතල ලෙස, මෙය ඔබට ලබා ගත හැකි තරම් WYSIWYG වෙතින්! රළු කියවිය නොහැකි අවුලක්, මට ඔබේ කේතය මත වැඩ කිරීමට සිදුවුවහොත්, මම දවස පුරා ශාප කරනු ඇත ... සමාවෙන්න: - /
රීගාඩ් ස්ටේන්

2
El හෙලියැක් සීටී කොටස දර්ශනයට ඇතුළත් කළ අතර ඔබට කිසි විටෙකත් අවුල නොපෙනේ. දිගු හා සංකීර්ණ AND සඳහා, හෝ, එය CASE ට වඩා කියවිය නොහැක (ඇත්ත වශයෙන්ම එම කොටස cte වලින් පිටත).
ටොමසිටෝ

1
මම මෙය පිළිවෙලට +1 ලබා දී ඇත, එය වර්‍ගයකට ගිය පසු, නමුත් පිළිතුර දැනට ප්‍රශ්නයට වැරදිය. ඔබට '|' '&' නොවේ.
මාර්ක් හර්ඩ්

3
@ හෙලියැක් සමඟ සම්පුර්ණයෙන්ම එකඟ වන්න. එය කෘතිමව නිවැරදි වන අතර හොඳින් ක්‍රියාත්මක වන අතර එය පහසුවෙන් සහාය විය නොහැක. එය CTE එකක තැබීමෙන් කියවිය නොහැකි කේත කැබැල්ල වෙනත් තැනකට ගෙන යනු ඇත.
objectNotFound

1
සංයෝජන පරීක්ෂා කිරීමේ වගු ක්‍රමයට එහි වාසි තිබිය හැකිය. වගු විචල්‍යයක් භාවිතා කිරීම සහ පවතින විමසුමට එය සම්බන්ධ කිරීම නඩුවකින් තොරව කට්ටල පදනම් කරගත් විසඳුමක් ලබා දිය හැකිය. මෙම පිළිතුර දුර්වල උදාහරණයකි, නමුත් වගු අදහසටම කුසලතා ඇත.
සන්කැට් 2000

19
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' )


14
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

2
අසන ලද ප්‍රශ්නයට මෙය පිළිතුරු සපයන ආකාරය පිළිබඳව කරුණාකර යම් පැහැදිලි කිරීමක් කළ හැකිද?
ගුවාන්සි

U ගුවාන්සි: මගේ පිළිතුර නොවුනත්, 'නඩුවක්' 'එසේ නම්-එසේ නම්' සාමාන්‍යකරණය කරයි (අවස්ථා 2 සිට බොහෝ දක්වා)
ජෝශප් ඩොගී

ඔබට විස්තර කළ හැකිද?
පීටර් මෝර්ටෙන්සන්

13

මෙය පිළිතුරක් නොවේ, මා සේවය කරන ස්ථානයේ භාවිතා වන 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]

1
සිද්ධි ප්‍රකාශ නැවත ආකෘතිකරණය කළ සංස්කරණය සියල්ලම කදිම හා දඩබ්බර වන අතර එය වඩාත් තේරුම්ගත හැකි නමුත් SQL තවමත් එය භාවිතා කරන දෘෂ්ටිය තුළ එකවරම රැඳෙනු ඇත.
JustJohn

1
මම දැන් ඉබාගාතේ යන්නේ CASEඋත්තරය වෙනුවට පිළිතුරක් ලෙස සලකුණු කර ඇත්තේ ඇයිද යන්න වෙනුවට IF, මේ වගේ, මෙය තවමත් CASEප්‍රකාශයක් මිස පිළිතුරක් නොවේ IF.
ජේ

J ජේ. මහතා: මගේ පිළිතුර නොවුනත්, 'නඩුවක්' 'එසේ නම්-එසේ නම්' සාමාන්‍යකරණය කරයි (අවස්ථා 2 සිට බොහෝ දක්වා)
ජෝසෆ් ඩොගී

12

ප්‍රති results ල එක් වගුවකින් තවත් වගුවකට මාරු කරනවාට වඩා පළමු වරට ඔබ වගුවකට ඇතුළත් කරන්නේ නම්, මෙය ඔරකල් 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');

4
ටැග් වලින් කියවෙන්නේ SQL Server, TSQL
Malachi

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

ප්‍රති ult ලය:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1

විමසීමේදී කුමන තත්වයකද විකුණුම් භාවිතා කරන්නේ?
භවින් තුම්මර්

එය කොතැනක සිටියත් භාවිතා කළ හැකිය.
සර්කන් අර්ස්ලාන්

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

6

SQL Server 2012 භාවිතා කරන්නන් සඳහා, IIF යනු එකතු කර ඇති අතර සිද්ධි ප්‍රකාශයන්ට විකල්පයක් ලෙස ක්‍රියා කරයි.

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

1
මෙම පිළිතුර මීට වසර කිහිපයකට පෙර මාටින් ස්මිත් විසින් ලබා දී ඇති පිළිතුර (අඩු විස්තර සහිතව) පුනරාවර්තනය වේ .
jk7

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

7
හායි සුර්ජීත් සිං බිෂ්ට්; ඔබේ කේතය නිවැරදි විය හැකි නමුත් යම් සන්දර්භයක් සමඟ එය වඩා හොඳ පිළිතුරක් ලබා දෙනු ඇත; උදාහරණයක් ලෙස, මෙම යෝජිත වෙනස මඟින් ප්‍රශ්න කරන්නාගේ ගැටලුව විසඳන්නේ කෙසේද සහ ඇයි, සමහර විට අදාළ ලියකියවිලි සමඟ සබැඳියක් ද ඇතුළත් කළ හැකිය. එය ඔවුන්ට වඩාත් ප්‍රයෝජනවත් වන අතර සමාන ගැටළු වලට විසඳුම් සොයන වෙනත් අඩවි පා readers කයන්ටද එය වඩාත් ප්‍රයෝජනවත් වනු ඇත.
වින්ස් බෝඩ්රන්

5
මෙම පිළිතුර අලුත් දෙයක් එකතු නොකරයි. ඇත්ත වශයෙන්ම මෙම රේඛාවම වසර 5 කට වැඩි කාලයක් තිස්සේ පිළිගත් පිළිතුරේ කොටසකි .
එස්එල් බාර්ත් - මොනිකා නැවත

1
අයිඅයිඑෆ් අදාළ වන්නේ 2012 සිට ඇරඹෙන SQL සේවාදායකයට පමණක් බව සඳහන් කිරීම වැදගත්ය
අයිවන් රාස්කන්

5

මෙය සැබවින්ම ක්‍රියාත්මක කිරීම සඳහා ඔබට තේරීම් දෙකක් තිබිය හැකිය:

  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

4

ප්‍රශ්නය:

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මේ අවස්ථාවේ දී - ගැටළු වළක්වා ගැනීමට උපකාරී වේ.


3

SQL CASE භාවිතා කිරීම සාමාන්‍ය නම් / වෙනත් ප්‍රකාශ වලට සමානය. පහත විමසුමේදී, යල්පැනගිය අගය = 'එන්' නම් හෝ ඉන්ස්ටොක් අගය = 'වයි' නම් ප්‍රතිදානය 1. වනු ඇත. එසේ නොමැතිනම් ප්‍රතිදානය 0 වනු ඇත. ඉන්පසු අපි එම 0 හෝ 1 අගය විකුණුම් තීරුව යටතේ තබමු.

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

එය සාමාන්‍ය නම් / වෙනත් ප්‍රකාශයන්ට සමානය. යල්පැනගිය අගය = 'එන්' හෝ ඉන්ස්ටොක් අගය = 'වයි' නම් ප්‍රතිදානය 1. වනු ඇත. එසේ නොමැතිනම් ප්‍රතිදානය 0 වනු ඇත.
තරකා

1
ඔබට ස්තුතියි. මෙම පැහැදිලි කිරීම එක් කිරීමට කරුණාකර ඔබගේ ලිපිය සංස්කරණය කරන්න. වැනි: If..Then...Else..ප්‍රකාශන භාවිතය SQLපහත පරිදි වේ ....

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

8
සමාලෝචනයෙන්: තොග පිටාර ගැලීම වෙත සාදරයෙන් පිළිගනිමු! කරුණාකර ප්‍රභව කේතයෙන් පමණක් පිළිතුරු නොදෙන්න. ඔබේ විසඳුම ක්‍රියාත්මක වන ආකාරය පිළිබඳ හොඳ විස්තරයක් ලබා දීමට උත්සාහ කරන්න. බලන්න: මම හොඳ පිළිතුරක් ලියන්නේ කෙසේද? . ස්තූතියි
සුනා qıɔp

3
'THEN' මූල පදය අනුගමනය කරන කිසිදු ප්‍රතිදානයක් එහි නොමැති නිසා මෙය ක්‍රියාත්මක නොවන බව ඔබට පෙනී යනු ඇතැයි මම සිතමි.
ඩොඩෙකැෆෝන්

ඔබට විස්තර කළ හැකිද?
පීටර් මෝර්ටෙන්සන්

2

එය එවැනි දෙයක් වනු ඇත:

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;

විමසුමක තත්වය තුළ අපට QuantityText අගය භාවිතා කළ හැකිද? උදාහරණයක් ලෙස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 WHERE QuantityText = 'The quantity is 30';
භවින් තුම්මර්

1

සම්පූර්ණත්වය සඳහා, SQL අගය තුනකින් යුත් තර්කනයක් භාවිතා කරන බව මම එකතු කරමි. ප්‍රකාශනය:

obsolete = 'N' OR instock = 'Y'

පැහැදිලි ප්‍රති results ල තුනක් ලබා දිය හැකිය:

| 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     |

උදාහරණයක් ලෙස නිෂ්පාදනයක් යල්පැන ඇති නමුත් නිෂ්පාදිතය ඉන්ස්ටොක් දැයි ඔබ නොදන්නේ නම් නිෂ්පාදිතය විකිණිය හැකි දැයි ඔබ නොදනී. ඔබට මෙම වටිනාකම් තුනේ තර්කනය පහත පරිදි ලිවිය හැකිය:

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

එය ක්‍රියාත්මක වන්නේ කෙසේදැයි ඔබ හඳුනාගත් පසු, ශුන්‍ය හැසිරීම තීරණය කිරීමෙන් ඔබට ප්‍රති results ල තුනක් ප්‍රති results ල දෙකකට පරිවර්තනය කළ හැකිය. උදා: මෙය ශුන්‍ය නොවන ලෙස සලකනු ඇත:

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

0

මම CASE ප්‍රකාශ භාවිතා කිරීමට කැමතියි නමුත් ප්‍රශ්නය SQL තේරීමෙහි IF ප්‍රකාශයක් ඉල්ලා ඇත. මම අතීතයේ භාවිතා කළ දේ:

SELECT

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

FROM ...

එය නියම තත්වය හා පසුව ව්‍යාජ කොන්දේසියක් ඇති කොන්දේසියක් ඇති එක්සෙල් හෝ ෂීට් අයිඑෆ් ප්‍රකාශයන් වැනි ය:

if(condition, true, false)

තවද, ඔබට if ප්‍රකාශයන් කැදැල්ලට දැමිය හැකිය (නමුත් භාවිතා කිරීම සඳහා CASE භාවිතා කළ යුතුය :-)

(සටහන: මෙය MySQLWorkbench හි ක්‍රියාත්මක වන නමුත් වෙනත් වේදිකාවල ක්‍රියා නොකරනු ඇත)


0

ඔබට සිද්ධි ප්‍රකාශය භාවිතා කළ හැකිය:

Select 
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.