Все строковые операции (например, || -связь) связаны максимальным пределом размера VarChar
(который составляет 32 КБ, что составляет менее 8200 букв в кодированном тексте UTF-8).
Однако, похоже, есть BLOB
-ориентированные функции. Также не нужно экранировать NULL
-значения с COALESCE
.
LIST возвращает строку, состоящую из ненулевых значений аргумента в группе, разделенных запятой или предоставленным пользователем разделителем
https://firebirdsql.org/refdocs/langrefupd21-aggrfunc-list.html
Следовательно, используя derived tables
:
Select LIST(ALL X, '') From
( Select fieldTarget as x From tablename Where tablePk = :pkTarget
UNION ALL
Select Cast( :string AS VarChar(8191) ) From RDB$DATABASE )
As TMP
Введением типов является присвоение типа данных выражению только для параметров.
P.S. в документации также утверждается, что
Порядок значений в списке не определен.
P.P.S. Готов к запуску пример, протестирован на FB 2.1.7
Select LIST(ALL X, '') From
( Select Cast( :str_pre AS VarChar(8191) ) as X From RDB$DATABASE
UNION ALL
Select /* DATA column */ RDB$TRIGGER_SOURCE
From /* DATA table */ RDB$TRIGGERS
Where /* PK ID */ RDB$TRIGGER_NAME = :pkTarget
UNION ALL
Select Cast( :str_post AS VarChar(8191) ) From RDB$DATABASE
)
Передача имен, таких как RDB$TRIGGER_1
, даст вам system trigger
, у которого нет исходного текста, поэтому в поле есть значение NULL
. Легко проверить, что вам не нужно COALESCE
- здесь: -D