මම කෙසේද ඉටු කරන්නේ IF...THEN
තුළ සිටින SQL SELECT
ප්රකාශයක්?
උදාහරණයක් වශයෙන්:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
සහ CHECK
නමුත් SELECT
.
මම කෙසේද ඉටු කරන්නේ IF...THEN
තුළ සිටින SQL SELECT
ප්රකාශයක්?
උදාහරණයක් වශයෙන්:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
සහ CHECK
නමුත් SELECT
.
Answers:
මෙම 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
සිද්ධි ප්රකාශය මෙම තත්වය තුළ ඔබේ මිතුරා වන අතර එය ආකාර දෙකෙන් එකක් ගනී:
සරල අවස්ථාව:
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>
සැබවින්ම විසිතුරු ඇණවුම් කිරීම සඳහා වගන්තිය මඟින් ඔබට සිද්ධි ප්රකාශයන් ඇණවුමකට දැමිය හැකිය.
AS Col_Name
END
SQL Server 2012 වෙතින් ඔබට මේ සඳහා IIF
ශ්රිතය භාවිතා කළ හැකිය .
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
මෙය effectively ලදායී ලෙස කෙටිමං (සම්මත SQL නොවුනත්) ලිවීමේ ක්රමයකි CASE
.
පුළුල් කළ CASE
අනුවාදය සමඟ සසඳන විට මම සංක්ෂිප්තභාවයට කැමැත්තෙමි .
දෙකම IIF()
සහ CASE
SQL ප්රකාශයක් තුළ ප්රකාශන ලෙස විසඳා ගත හැකි අතර එය භාවිතා කළ හැක්කේ හොඳින් නිර්වචනය කළ ස්ථානවල පමණි.
ගනුදෙනු- 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
කෙසේ වෙතත් මෙම ප්රවේශය සමඟ පරාමිති වංචා කිරීමේ ගැටළු වළක්වා ගැනීමට ඇතැම් විට සැලකිලිමත් විය යුතුය .
The Power of SQL CASE ප්රකාශන වල ඔබට හොඳ උදාහරණ කිහිපයක් සොයාගත හැකි අතර, ඔබට භාවිතා කළ හැකි ප්රකාශය මෙවැනි දෙයක් වනු ඇතැයි මම සිතමි ( 4guysfromrolla වෙතින් ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
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
where Obsolete = 'N' or InStock = 'Y'
ප්රායෝගිකව අඩක් කපා දැමුවේ
සිට , මෙම සබැඳිය ඔස්සේ , අපි තේරුම් ගත හැක 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 සඳහා මෙය ප්රමාණවත් නොවේද?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
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
SELECT
OP ඇසූ පරිදි එය ඇතුළත භාවිතා කළ හැකිද?
SQL සේවාදායකය 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
වැඩකරන නිරූපණයcase
බලන්න : එසේ නම් SQL සේවාදායකය නොමැතිව .
ආරම්භය සඳහා, ඔබ තෝරාගත් කොන්දේසි වල වටිනාකම true
සහ වැඩ කිරීම අවශ්ය වේ false
. මෙන්න 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]
CASE
උත්තරය වෙනුවට පිළිතුරක් ලෙස සලකුණු කර ඇත්තේ ඇයිද යන්න වෙනුවට IF
, මේ වගේ, මෙය තවමත් CASE
ප්රකාශයක් මිස පිළිතුරක් නොවේ IF
.
ප්රති 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');
ප්රකාශයට විකල්ප විසඳුමක් ලෙස 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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
SQL Server 2012 භාවිතා කරන්නන් සඳහා, IIF යනු එකතු කර ඇති අතර සිද්ධි ප්රකාශයන්ට විකල්පයක් ලෙස ක්රියා කරයි.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(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 Saleable, * FROM Product
භාවිතා කිරීම Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
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
මේ අවස්ථාවේ දී - ගැටළු වළක්වා ගැනීමට උපකාරී වේ.
SQL CASE භාවිතා කිරීම සාමාන්ය නම් / වෙනත් ප්රකාශ වලට සමානය. පහත විමසුමේදී, යල්පැනගිය අගය = 'එන්' නම් හෝ ඉන්ස්ටොක් අගය = 'වයි' නම් ප්රතිදානය 1. වනු ඇත. එසේ නොමැතිනම් ප්රතිදානය 0 වනු ඇත. ඉන්පසු අපි එම 0 හෝ 1 අගය විකුණුම් තීරුව යටතේ තබමු.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
If..Then...Else..
ප්රකාශන භාවිතය SQL
පහත පරිදි වේ ....
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
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;
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';
සම්පූර්ණත්වය සඳහා, 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
මම CASE ප්රකාශ භාවිතා කිරීමට කැමතියි නමුත් ප්රශ්නය SQL තේරීමෙහි IF ප්රකාශයක් ඉල්ලා ඇත. මම අතීතයේ භාවිතා කළ දේ:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
එය නියම තත්වය හා පසුව ව්යාජ කොන්දේසියක් ඇති කොන්දේසියක් ඇති එක්සෙල් හෝ ෂීට් අයිඑෆ් ප්රකාශයන් වැනි ය:
if(condition, true, false)
තවද, ඔබට if ප්රකාශයන් කැදැල්ලට දැමිය හැකිය (නමුත් භාවිතා කිරීම සඳහා CASE භාවිතා කළ යුතුය :-)
(සටහන: මෙය MySQLWorkbench හි ක්රියාත්මක වන නමුත් වෙනත් වේදිකාවල ක්රියා නොකරනු ඇත)