Tema: Re: T-SQL OR vs IN
Autorius: Laimis
Data: 2009-11-17 18:31:57
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.