O valor TSqlOperator passado a ParseInput
controla o operador de comparação inserido em
SQLExpression. Não afeta a análise nem a validação; apenas
altera a forma do fragmento de SQL produzido.
| Operador | Valor único | Lista | Intervalo |
|---|---|---|---|
sopEqual |
= valor |
IN (…) |
BETWEEN x AND y |
sopNotEqual |
<> valor |
NOT IN (…) |
NOT BETWEEN x AND y |
sopGreaterEqual |
>= valor |
IN (…) |
BETWEEN x AND y |
sopLessEqual |
<= valor |
IN (…) |
BETWEEN x AND y |
sopGreater |
> valor |
IN (…) |
BETWEEN x AND y |
sopLess |
< valor |
IN (…) |
BETWEEN x AND y |
sopLikeRight |
LIKE 'valor%' |
IN (…) |
BETWEEN x AND y |
sopLikeLeft |
LIKE '%valor' |
IN (…) |
BETWEEN x AND y |
sopLikeBoth |
LIKE '%valor%' |
IN (…) |
BETWEEN x AND y |
sopContainsAny |
ElevateDB: CONTAINS ANY 'palavras'; outros:
LIKE '%w1%…%wN%' |
recolhido | BETWEEN x AND y |
sopContainsAll |
ElevateDB: CONTAINS ALL 'palavras'; outros:
LIKE '%w1%…%wN%' |
recolhido | BETWEEN x AND y |
O operador predefinido é sopEqual.
Para listas (otList), apenas sopEqual e
sopNotEqual produzem resultados distintos. Todos os outros
operadores produzem IN (…) — o mesmo que
sopEqual.
Entrada: "1;2;3", itInteger, sopGreaterEqual
SQLExpression: IN (1, 2, 3) -- não >= 1, 2, 3
Entrada: "1;2;3", itInteger, sopNotEqual
SQLExpression: NOT IN (1, 2, 3)
Para intervalos (otRange), apenas sopEqual
e sopNotEqual produzem resultados distintos. Todos os
outros operadores produzem BETWEEN … AND ….
Entrada: "1~100", itInteger, sopLessEqual
Expressão SQL: BETWEEN 1 AND 100 -- não <= 1~100
Entrada: "1~100", itInteger, sopNotEqual
Expressão SQL: NOT BETWEEN 1 AND 100
Quando o token de valor único é NULL (entrada vazia para
valores tipados ou itString com
opEmptyStringNull), sopNotEqual produz
IS NOT NULL e todos os outros operadores produzem
IS NULL, independentemente do operador solicitado.
Entrada: "", itInteger, sopGreater
SQLExpression: IS NULL -- não > NULL
sopLikeRight, sopLikeLeft e
sopLikeBoth só têm significado para valores únicos
itString. Para todos os outros tipos ou formas de
resultado, recorrem silenciosamente ao comportamento de
sopEqual.
O valor do utilizador é sempre escapado antes de ser incorporado no
padrão: \, % e _ são prefixados
com \. Para todos os dialetos, exceto
sqlBDEParadox, a cláusula ESCAPE '\' é anexada
à expressão. No sqlBDEParadox, os caracteres continuam a
ser substituídos, mas não é emitida nenhuma cláusula
ESCAPE, uma vez que a camada SQL do BDE não oferece um
suporte fiável para a mesma.
Entrada: "O'Brien", itString, sopLikeLeft, sqlElevateDB
SQLExpression: LIKE '%O''Brien' ESCAPE '\'
Entrada: "100%", itString, sopLikeBoth, sqlElevateDB
SQLExpression: LIKE '%100\%%' ESCAPE '\'
Para listas e intervalos com operadores LIKE, a saída é
IN (…) / BETWEEN … AND … — tal como no
sopEqual.
O sopContainsAny e o sopContainsAll só
fazem sentido para valores itString. Para todos os outros
tipos, recorrem a = valor.
No sqlElevateDB, os predicados nativos de texto completo
são utilizados diretamente. O motor trata %, _
e \ como literais, pelo que não é aplicada qualquer escape
ao argumento.
Entrada: "hello world", itString, sopContainsAny, sqlElevateDB
Expressão SQL: CONTAINS ANY 'hello world'
Entrada: "hello world", itString, sopContainsAll, sqlElevateDB
Expressão SQL: CONTAINS ALL 'hello world'
Em todos os outros dialetos, sopContainsAny e
sopContainsAll recorrem a LIKE '%value%' com
escape de metacaracteres (tal como sopLikeBoth).
Quando a entrada é uma lista, os tokens são
agrupados num único argumento em vez de produzirem
IN (…). Os tokens vazios (incluindo NULL e
'') são excluídos do argumento agrupado.
No sqlElevateDB, as palavras são unidas por um espaço
num único argumento CONTAINS:
Entrada: "hello;world", itString, sopContainsAny, sqlElevateDB
Expressão SQL: CONTAINS ANY 'hello world'
Noutros dialetos, as palavras são escapadas e unidas com
%:
Entrada: "hello;world", itString, sopContainsAny, sqlMySQL
Expressão SQL: LIKE '%hello%world%' ESCAPE '\'
A ordem das palavras no fallback LIKE é significativa: o
padrão %hello%world% corresponde a strings que
contenham hello seguido de world em qualquer
posição, mas não a world seguido de hello. Os
predicados nativos do ElevateDB são independentes da ordem.
sopContainsAny e sopContainsAll produzem
BETWEEN … AND … para intervalos — tal como
sopEqual. A pesquisa de texto completo e os
queries de intervalo são conceitos ortogonais; utilize uma
lista ou um valor único para operações CONTAINS.
Quando a entrada está vazia e o tipo não é itString (ou
itString com opEmptyStringNull),
sopNotEqual produz IS NOT NULL em vez de
<> NULL.
Entrada: "", itDate, sopNotEqual
Expressão SQL: IS NOT NULL
Entrada: "", itDate, sopEqual
Expressão SQL: IS NULL