多条件查询

时间:2013-04-23 12:59:46

标签: plsql oracle10g

我的公司常驻pl / sql guru本周正在度假,我想我会在这里尝试我的问题大师。我想我的SQL是中等水平的,但是,我是新的Oracle。

我有一个包含3列的表:Id [数字(9,2)],FirstName [VarChar2(20)],LastName [VarChar2(25)]

我正在尝试编写1个可以支持并返回以下内容的sql查询:

  1. 如果是FirstName,LastName& Id match ='已登记'
  2. 如果ID遗失或不匹配='未注册'
  3. 如果Id& LastName匹配,但FirstName不='FirstName不匹配'
  4. 如果Id& FirstName匹配,但LastName不='LastName不匹配'
  5. 如果ID匹配,但FirstName& LastName不='FirstName& LastName不匹配'
  6. 我可以在多个查询中执行此操作,但有趣的是。提前谢谢!

2 个答案:

答案 0 :(得分:0)

使用union返回单个结果集

如果满足给定条件,则使用函数返回字符串:

StringIf(condition,valueToReturnIfTrue,valueToReturnIfFalse)

并在选择中使用它:

SELECT StringIf(t.fname = t.lname,'true','false')为samenames,StringIf(..)为same2,

如果您喜欢,请标记:)

答案 1 :(得分:0)

假设您有另一个表cmpTable ( cmpId, cmpFirstName, cmpLastName )具有相同的列定义并且cmpID用于存储候选集的PK,

  select cmpId
         CASE 4 * eqID + 2 * eqFN + eqLN
             WHEN 7 THEN 'Enrolled'
             WHEN 5 THEN 'FirstName Does Not Match'
             WHEN 6 THEN 'LastName Does Not Match'
             WHEN 4 THEN 'FirstName & LastName Does Not Match'
             ELSE 'Not Enrolled'
         END
    from (
              select cmpId
                   , CASE ID        WHEN cmpID          THEN 1 ELSE 0 END    eqID
                   , CASE FirstName WHEN cmpFirstName   THEN 1 ELSE 0 END    eqFN
                   , CASE LastName  WHEN cmpLastName    THEN 1 ELSE 0 END    eqLN
                from table      t1
                join cmpTable   ct ON ( ct.cmpID = t1.ID )
               union
              select cmpId
                   , 0      eqID
                   , 0      eqFN
                   , 0      eqLN
                from cmpTable
               where not exists (
                        select 1 
                          from table t2
                         where t2.ID = cmpID
                     )
         ) 
       ;