Na parte de expressões SQL, o Firebird 2.5 acrescenta melhorias e novidades. A função agregada LIST (presente desde a versão 2.1) agora aceita qualquer expressão em seu segundo parâmetro, onde o desenvolvedor pode especificar a string de separação dos elementos retornados. Até a versão 2.1.3 era possível apenas o uso de strings constantes nesse parâmetro. Nota: a versão 2.1.4 também deve ser liberada com esta novidade. A listagem 10 mostra a utilidade deste parâmetro, principalmente no desenvolvimento de relatórios, agrupando várias mensagens referentes a um documento em um mesmo registro e mostrando cada mensagem em uma linha.

Listagem 10. Usando a função LIST com expressões no segundo parâmetro.

SELECT LIST(MENSAGEM, ASCII_CHAR(13) || ASCII_CHAR(10))
 FROM MENSAGENS_DOCUMENTO WHERE DOCUMENTO = 10;

Referente a parâmetros de comandos SQL, o Firebird suporta apenas o uso de parâmetros anônimos com o símbolo “?” (ponto de interrogação). Algumas bibliotecas (inclusive de Delphi) aceitam o uso de parâmetros nomeados usando “:” (dois pontos). Quando o desenvolvedor tentava escrever queries usando o padrão [WHERE :CODIGO IS NULL OR CODIGO = :CODIGO] para trazer todos os registros quando o parâmetro não fosse informado, o Firebird retornava um erro. Isto porque este comando é traduzido pelas bibliotecas para [WHERE ? IS NULL OR CODIGO = ?] e o Firebird não aceitava o uso de parâmetro com o predicado IS NULL, pois o tipo do parâmetro era considerado como desconhecido. Na versão 2.5 foi adicionado à API o tipo SQL_NULL. As bibliotecas de acesso precisam entender este novo tipo e apenas passar se o valor do parâmetro é ou não NULL, permitindo assim o uso deste padrão de comando.

Outra novidade referente a expressões é o novo predicado SIMILAR TO. Esta expressão é usada para fazer comparações usando expressões regulares de acordo com o padrão SQL. A listagem 11 mostra uma verificação de números de telefones cadastrados fora do padrão (NN) NNNN-NNNN. O caractere de escape funciona exatamente como no comando LIKE, considerando o próximo caractere como um valor literal, ao invés de usá-lo como um operador.

Listagem 11. Verificando números de telefones cadastrados fora do padrão.
SELECT * FROM PESSOAS
 WHERE TELEFONE NOT SIMILAR TO
   '([0-9]{2}) [0-9]{4}-[0-9]{4}' escape ''
A tabela 1 mostra os operadores permitidos em expressões regulares e a tabela 2 mostra as classes de caracteres que podem ser usadas com o operador [[:CLASSE:]].


Operador
Descrição
X{2}
Duas ocorrências de X.
X{2,}
Duas ou mais ocorrências de X.
X{4,6}
De quatro a seis ocorrências de X.
X?
Zero ou uma ocorrência de X.
X*
Zero ou mais ocorrências de X.
X+
Uma ou mais ocorrências de X.
X|Y
X ou Y.
_
Qualquer caractere - como no LIKE.
%
Qualquer sequência de caracteres - como no LIKE.
(X)
Agrupa X para ser tratado pelo operador subsequente.
[XYZ]
Qualquer caractere igual a X, Y ou Z.
[^XYZ]
Qualquer caractere diferente de X, Y ou Z.
[X-Z]
Qualquer caractere entre X e Z.
[[:CLASSE:]]
Qualquer caractere de uma certa classe, conforme tabela 2.