Operadores

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.

Referência de operadores

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.

Listas

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)

Intervalos

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

Valores únicos NULL

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

Operadores LIKE

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.

Operadores CONTAINS

O sopContainsAny e o sopContainsAll só fazem sentido para valores itString. Para todos os outros tipos, recorrem a = valor.

Valor único

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

Lista

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.

Intervalo

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.

sopNotEqual e entrada vazia

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
(C) 2026 Easygate, Lda