1

我的公司常驻 pl/sql 大师这周外出度假,我想我会在这里与大师一起讨论我的问题。我喜欢认为我的 SQL 处于中等水平,但是,我是新的 Oracle。

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

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

  1. 如果 FirstName、LastName 和 Id 匹配 = 'Enrolled'
  2. 如果 ID 缺失或不匹配 = '未注册'
  3. 如果 Id & LastName 匹配,但 FirstName 不匹配 = 'FirstName 不匹配'
  4. 如果 Id & FirstName 匹配,但 LastName 不匹配 = 'LastName 不匹配'
  5. 如果 ID 匹配,但名字和姓氏不匹配 = '名字和姓氏不匹配'

我可以通过多个查询来做到这一点,但这有什么好玩的。先感谢您!

4

2 回答 2

0

使用联合返回单个结果集

或者

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

StringIf(条件,valueToReturnIfTrue,valueToReturnIfFalse)

并在选择中使用它:

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

喜欢就点个赞吧:)

于 2013-04-23T13:17:08.907 回答
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
                     )
         ) 
       ;
于 2013-04-23T16:25:26.487 回答