IF rašė:
> Pobarabanum WHERE IN(....) ). Taigi as iki siol zinojau kad OR ir IN duomenu
> bazes traktuoja kaip skirtingus operatorius, taigi nieko as nevaidinu, bet
> nuosirdziai klausiu, nes tikrai nezinau, kokiose Duomenu bazese
> TRANSACT-SQL siuos du operatorius suplaka i viena ir kur tai parasyta?
Drįsčiau teigti, kad visose.
Štai keletas jų:
SQLite, where.c:
** CASE 1:
**
** If all subterms are of the form T.C=expr for some single column of C
** a single table T (as shown in example B above) then create a new virtual
** term that is an equivalent IN expression. In other words, if the term
** being analyzed is:
**
** x = expr1 OR expr2 = x OR x = expr3
**
** then create a new virtual term like this:
**
** x IN (expr1,expr2,expr3)
FireBird, sql.cpp (SQL expresssion parser):
(IN sąrašo elementai jungiami binariniu OR operatoriumi ir sudaroma OR
grandinėlė; tikiuosi nereikia įrodinėti, kad lygiai tokia pati OR
grandinėlė susidaro apdorojant OR sąlygas?)
static GPRE_NOD par_in( gpre_req* request, GPRE_NOD value)
<...>
node = MSC_binary(nod_or, node, MSC_binary(nod_eq, value, value2));
PostgreSQL, parse_expr.c:
(IN sąrašo elementai jungiami binariniu OR operatoriumi arba binariniu
AND operatoriumi, kai/jei tai yra NOT IN() ir tokiu būdu sudaroma OR/AND
grandinėlė)
static Node *
transformAExprOr(ParseState *pstate, A_Expr *a)
{
<...>
return (Node *) makeBoolExpr(OR_EXPR,
list_make2(lexpr, rexpr),
a->location);
static Node *
transformAExprIn(ParseState *pstate, A_Expr *a)
{
<...>
result = (Node *) makeBoolExpr(useOr ? OR_EXPR : AND_EXPR,
list_make2(result, cmp),
a->location);
MySQL'e jau giliau, kompleksiškiau įvilkta -- ne taip akivaizdu, tačiau
neabejoju, kad gaunama ta pati OR grandinėlė (o techniškai to pačio
kompleksiškumo, Big O prasme, uždavinys); gali pasinagrinėti pats.