PLSQL:案例结果中有多个值

PLSQL:案例结果中有多个值,plsql,case,Plsql,Case,我正在动态地为我的PLSQL查询(以及许多其他类似查询)设置要排序的列。我想添加一个默认情况,其中它在三列上排序 以下是我的尝试: -- ... long SQL query -- ps_global_order is the column to sort on, passed in to stored procedure. -- ps_global_order_dir is the direction to sort on, similarly passed in. or

我正在动态地为我的PLSQL查询(以及许多其他类似查询)设置要排序的列。我想添加一个默认情况,其中它在三列上排序

以下是我的尝试:

-- ... long SQL query
--      ps_global_order is the column to sort on, passed in to stored procedure.
--      ps_global_order_dir is the direction to sort on, similarly passed in. 
order by 
  case 
    -- this does not compile (00905 missing keyword):
    when ps_global_order is null then name, phone, email 
    -- this compiles, but I need it on the three columns:
    -- when ps_global_order is null then name  
  end,
  case
    when ps_global_order_dir <> 'ASC' then ''
    when ps_global_order like 'name' then name
  end,
  case
    when ps_global_order_dir <> 'ASC' then ''
    when ps_global_order like 'phone' then phone
  end,
  case
    when ps_global_order_dir <> 'ASC' then ''
    when ps_global_order like 'email' then email
  end,
  case
    when ps_global_order_dir <> 'DESC' then ''
    when ps_global_order like 'name' then name
  end,
  case
    when ps_global_order_dir <> 'DESC' then ''
    when ps_global_order like 'phone' then phone
  end,
  case
    when ps_global_order_dir <> 'DESC' then ''
    when ps_global_order like 'email' then email 
  end
--。。。长SQL查询
--ps_global_order是要排序的列,传递给存储过程。
--ps_global_order_dir是排序的方向,类似地传入。
订购人
案例
--未编译(00905缺少关键字):
当ps_全局_订单为空时,则为姓名、电话、电子邮件
--这可以编译,但我需要在三列中使用它:
--当ps_全局_顺序为空时,则为name
完,,
案例
当ps_全局_订单_dir'ASC'时,则''
当ps_全局_顺序如“name”时,则为name
完,,
案例
当ps_全局_订单_dir'ASC'时,则''
当ps_global_订单如“电话”时,则电话
完,,
案例
当ps_全局_订单_dir'ASC'时,则''
当ps_global_订单如“电子邮件”时,则发送电子邮件
完,,
案例
当ps_全局_订单_目录'DESC'时,则'
当ps_全局_顺序如“name”时,则为name
完,,
案例
当ps_全局_订单_目录'DESC'时,则'
当ps_global_订单如“电话”时,则电话
完,,
案例
当ps_全局_订单_目录'DESC'时,则'
当ps_global_订单如“电子邮件”时,则发送电子邮件
结束
一切正常,但我想指定要排序的三列


使用
CASE
语句是否可以这样做?我必须求助于动态SQL,还是缺少一种解决方法

我不想这么快就回答我自己的问题,但我明白了:

order by 
    case  when nvl(ps_global_order, ' ') = ' ' then name end,
    case  when nvl(ps_global_order, ' ') = ' ' then phone end,
    case  when nvl(ps_global_order, ' ') = ' ' then email end,
    case
        when ps_global_order_dir <> 'ASC' then ''
    -- continues...
orderby
当nvl(ps_全局_顺序,'')=''然后名称结束时,
当nvl(ps_全局_顺序“”)为“”时,则手机结束,
当nvl(ps_全局_顺序“”)为“”时,则电子邮件结束,
案例
当ps_全局_订单_dir'ASC'时,则''
--继续。。。
这是一个很大的帮助,但却被谷歌的搜索结果掩盖了。不过,我不知道没有逗号的情况下这是如何工作的

这样做:

-- ... long SQL query
--      ps_global_order is the column to sort on, passed in to stored procedure.
--      ps_global_order_dir is the direction to sort on, similarly passed in. 
order by 
  case 
    when ps_global_order is null then name
    else null
  end,
  case
    when ps_global_order is null then phone
    else null
  end,
  case
    when ps_global_order is null then email
    else null
  end,
  case
    when ps_global_order_dir <> 'ASC' then null
    when ps_global_order like 'name' then name
  end,
  case
    when ps_global_order_dir <> 'ASC' then null
    when ps_global_order like 'phone' then phone
  end,
  case
    when ps_global_order_dir <> 'ASC' then null
    when ps_global_order like 'email' then email
  end,
  case
    when ps_global_order_dir <> 'DESC' then null
    when ps_global_order like 'name' then name
  end,
  case
    when ps_global_order_dir <> 'DESC' then null
    when ps_global_order like 'phone' then phone
  end,
  case
    when ps_global_order_dir <> 'DESC' then null
    when ps_global_order like 'email' then email 
  end
--。。。长SQL查询
--ps_global_order是要排序的列,传递给存储过程。
--ps_global_order_dir是排序的方向,类似地传入。
订购人
案例
当ps_全局_顺序为空时,则为name
否则无效
完,,
案例
当ps_全局_订单为空时,电话
否则无效
完,,
案例
当ps_全局_订单为空时,则发送电子邮件
否则无效
完,,
案例
当ps_全局_顺序_目录'ASC'时,则为null
当ps_全局_顺序如“name”时,则为name
完,,
案例
当ps_全局_顺序_目录'ASC'时,则为null
当ps_global_订单如“电话”时,则电话
完,,
案例
当ps_全局_顺序_目录'ASC'时,则为null
当ps_global_订单如“电子邮件”时,则发送电子邮件
完,,
案例
当ps_全局_顺序_目录'DESC'时,则为null
当ps_全局_顺序如“name”时,则为name
完,,
案例
当ps_全局_顺序_目录'DESC'时,则为null
当ps_global_订单如“电话”时,则电话
完,,
案例
当ps_全局_顺序_目录'DESC'时,则为null
当ps_global_订单如“电子邮件”时,则发送电子邮件
结束

请注意,我已将所有出现的
'
替换为
NULL
,这在我看来更清晰。

谢谢chakeda。绑定变量可用于替换文本,但不能用于静态编译中使用的表、列等sql对象。我认为需要动态sql来替换列名。逗号就在那里。这就是
结尾之后的内容。我想是的!PLSQL很奇怪。这实际上是直接SQL。您正在对一系列大小写表达式的结果进行排序。我现在明白了-我以为逗号是大小写语句之间的分隔符。这是漫长的一天