Порядок символов NLS_SORT WEST_EUROPEAN
У меня есть шаблон на столе 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 строки в результате. Проблема в том, что у меня есть система над оракулом DB, и я не могу делать свои собственные запросы или изменять параметры DB, только выбирать столбцы таблиц (или использовать только эти 4 функции max, min, sum и count по столбцам) и система выполняет все запросы самостоятельно, поэтому я не могу использовать большие трюки в предложении 'where' или 'order by' (принудительно задайте NLS_SORT как Binary или используйте, например, ROWNUM = 1). Итак, моя единственная идея - использовать другой символ вместо @ для определения параметров по умолчанию, использовать функцию MAX или MIN над T3.Value, но символ должен быть, безусловно, первым или последним в сортировке WEST_EUROPEAN. и я нигде не могу найти порядок сортировки этого. Может кто-нибудь мне помочь?
1 ответ
Включает ли список функций, которые вам разрешено использовать? 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>