Порядок символов 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>
Другие вопросы по тегам