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 ''
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. |