简体   繁体   English

如何在选择查询中添加if-then-else条件?

[英]How to add if-then-else conditions in a select query?

I would like to apply the following conditions in a select query . 我想在select query应用以下条件。

IF  (TYPE = MBUSA or SDSA or MDSA OR PC) and (FINAL_STATUS = ACTIVE OR EXECUTED) 
then GET ID and Parent_ID
ELSEIF (TYPE = MSA) and (FINAL_STATUS = ACTIVE OR EXECUTED)
then  GET ID---(USING the ID from the else if condition AS FILTER, 
IF TYPE = (DSA OR BUSA) AND (FINAL_STATUS = ACTIVE OR EXECUTED) 
then GET ID and Parent_ID)

Do I need to write a procedure? 我需要写程序吗?

Following is the database structure: 以下是数据库结构:

http://i.imgur.com/L1VqOE3.png

The CASE statement can be used as an equivalent of an IF.. THEN... ELSE... statement. CASE语句可以用作IF.. THEN... ELSE...的等效项IF.. THEN... ELSE...语句。 Not quite sure how you are wanting to select them as your question is unclear so here's a couple of suggestions. 尚不清楚您要如何选择它们,因为您的问题尚不清楚,因此有一些建议。

To select a single column with a string representation of the conditional formatting: 要选择具有条件格式的字符串表示形式的单列:

SELECT
    CASE
        WHEN (TYPE IN ('MBUSA','SDSA','MDSA','PC') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN ID + ' ' + P_ID
        WHEN ((TYPE = 'MSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED'))
            THEN ID
        WHEN (TYPE IN ('DSA','BUSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN ID + ' ' + P_ID
        ELSE ''
    END AS columnName
FROM
    tableName

To select each into separate columns 将每个选择到单独的列中

SELECT
    CASE
        WHEN (TYPE IN ('MBUSA','SDSA','MDSA','PC') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN ID
        WHEN ((TYPE = 'MSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED'))
            THEN ID
        WHEN (TYPE IN ('DSA','BUSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN ID
        ELSE ''
    END AS columnOneName
    CASE
        WHEN (TYPE IN ('MBUSA','SDSA','MDSA','PC') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN P_ID
        WHEN ((TYPE = 'MSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED'))
            THEN NULL
        WHEN (TYPE IN ('DSA','BUSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
            THEN  P_ID
        ELSE ''
    END AS columnTwoName
FROM
    tableName

Though looking at the above (I've probably transcribed your logic incorrectly) there are three case statements when you could get away with 2: 尽管看了上面的内容(我可能已经错误地转录了您的逻辑),但是当您可以摆脱2时,还是有以下三种情况:

CASE
    WHEN (TYPE IN ('MBUSA','SDSA','MDSA','PC','DSA','BUSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED')) 
        THEN ID + ' ' + P_ID
    WHEN ((TYPE = 'MSA') AND (FINAL_STATUS IN ('ACTIVE','EXECUTED'))
        THEN ID
    ELSE ''
END AS columnName

I know you've put a screenshot up now, but an SQL Fiddle would probably be more helpful or more detail so that table names etc. can be easily 我知道您现在已经设置了屏幕截图,但是SQL Fiddle可能会更有用或更详细,以便可以轻松地使用表名等。

Useful Links: 有用的链接:

http://technet.microsoft.com/en-us/library/ms181765.aspx http://technet.microsoft.com/zh-CN/library/ms181765.aspx

SQL Case Statement Syntax? SQL Case语句语法?

http://blog.sqlauthority.com/2007/04/14/sql-server-case-statementexpression-examples-and-explanation/ http://blog.sqlauthority.com/2007/04/14/sql-server-case-statementexpression-examples-and-explanation/

You can use CASE to implement IF-THEN-ELSE in PL/SQL - this is just an example: 您可以使用CASE在PL / SQL中实现IF-THEN-ELSE-这只是一个示例:

    select case field1 WHEN '1' THEN 'VALUE1'
                       WHEN '2' THEN 'VALUE2'
                       ELSE 'VALUEOTHER'
                       END,
           case field2 WHEN '1' THEN 'VALUE1'
                       WHEN '2' THEN 'VALUE2'
                       ELSE 'VALUEOTHER'
                       END                  
    from (                   

    select '1' "FIELD1",
           '2' "FIELD2"
    from dual
    );

You cannot use the CASE statement on multiple columns; 您不能在多个列上使用CASE语句; however, if you need to compare multiple fields in the same CASE statement, you could use a workaround like this: 但是,如果需要在同一CASE语句中比较多个字段,则可以使用如下解决方法:

    select case field1 || '_' || field2
                       WHEN '1_1' THEN 'FIELD1-IS-VALUE1 AND FIELD2-IS-VALUE1'
                       WHEN '1_2' THEN 'FIELD1-IS-VALUE1 AND FIELD2-IS-VALUE2'
                       WHEN '2_1' THEN 'FIELD1-IS-VALUE2 AND FIELD2-IS-VALUE1'
                       WHEN '2_2' THEN 'FIELD1-IS-VALUE2 AND FIELD2-IS-VALUE2'
                       ELSE 'VALUEOTHER'
                       END
    from (                   

    select '1' "FIELD1",
           '2' "FIELD2"
    from dual
    );

If the SQL statement becomes difficult to read it may be better to use views with the SQL statement or use PL/SQL. 如果SQL语句变得难以阅读,最好将视图与SQL语句一起使用或使用PL / SQL。

References: 参考文献:

https://dba.stackexchange.com/questions/18239/using-same-case-when-conditions-for-multiple-query-columns https://dba.stackexchange.com/questions/18239/using-same-case-when-conditions-for-multiple-query-columns

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM