NLS_SORT WEST_EUROPEAN的字符顺序

时间:2018-11-12 20:14:22

标签: sql oracle nls-sort

我在表T1上有一个模板

T1

ID | Name
---|----------
 1 | template1

然后,当有人在表T2上使用模板时,我需要填写一些参数

T2

ID | Template_ID | Params
---|-------------|---------
 1 |      1      | @param1
 2 |      1      | @param2
 3 |      1      | @param3
 4 |      1      | @param4

表T3用特定值链接模板和参数(如果用户未设置参数,则表中将填充默认名称,以便用户稍后进行设置)

T3

ID | Param_ID | Value
---|----------|---------
 1 |     1    |  xyz
 2 |     2    | @param2
 3 |     3    |   1
 4 |     4    | @param4

因此,我需要在至少1行中列出至少具有1个参数且没有特定值的模板,但是要使用以下查询:

select T1.Name, T3.Value
from T1 inner join T2
    on T1.ID = T2.Template_ID
inner join T3
    on T2.ID = T3.Param_ID
where T3.Value like '@%';

结果我得到了2行。问题是,我有一个基于oracle DB的系统,我无法执行自己的查询或更改DB参数,只能选择表的列(或仅对列使用max,min,sum和count这4个函数),然后系统自行完成所有查询,因此,我不能在“ where”或“ order by”子句上使用大把戏(例如,将NLS_SORT强制为Binary,或者使用ROWNUM = 1)。因此,我唯一的想法是使用另一个字符而不是@来标识默认参数,以便在T3.Value上使用MAX或MIN函数,但是,肯定地,该字符必须是WEST_EUROPEAN排序中的第一个或最后一个而且我在任何地方都找不到这的排序顺序。谁能帮我吗?

1 个答案:

答案 0 :(得分:0)

允许使用的功能列表包括LISTAGG吗?如果是这样,它将在1行中返回结果。这是一个示例:

SQL> with
  2  t1 (id, name) as
  3    (select 1, 'template1' from dual),
  4  t2 (id, template_id, params) as
  5    (select 1, 1, '@param1' from dual union all
  6     select 2, 1, '@param2' from dual union all
  7     select 3, 1, '@param3' from dual union all
  8     select 4, 1, '@param4' from dual
  9    ),
 10  t3 (id, param_id, value) as
 11    (select 1, 1, 'xyz'     from dual union all
 12     select 2, 2, '@param2' from dual union all
 13     select 3, 3, '1'       from dual union all
 14     select 4, 4, '@param4' from dual
 15    )
 16  select t1.name, listagg(t3.value, ',') within group (order by t3.value) params
 17  from t1 join t2 on t1.id = t2.template_id
 18  join t3 on t3.param_id = t2.id
 19  where t3.value like '@%'
 20  group by t1.name;

NAME      PARAMS
--------- --------------------
template1 @param2,@param4

SQL>