Re: Modifying SQL parser with extensions?

Поиск
Список
Период
Сортировка
От Dawid Kuroczko
Тема Re: Modifying SQL parser with extensions?
Дата
Msg-id 758d5e7f0610291241h6db68b50jf9705e494fa514d4@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Modifying SQL parser with extensions?  (Matthias Luedtke <matthias-luedtke@gmx.de>)
Список pgsql-general
On 10/29/06, Matthias Luedtke <matthias-luedtke@gmx.de> wrote:
>
> Alvaro Herrera wrote:
> >> In fact, parsing this SQL dialect would just be the first step, as the
> >> annotations within the query induce an ordering of the result set.
> >
> > Huh, what is this supposed to be able to do that you can't do with the
> > already existing ORDER BY clause?
>
> Basically, conditional statements are annotated with integers that
> represent weights, like
>
> (...)WHERE (foo = 'a')[42] OR (bar = 'b')[20]
>
> In the result set those entries that fulfill both conditions yield score
> 62, i.e. 42+20, and are ranked top, whereas entries that fulfill only
> one of the conditions yield scores 42 and 20 respectively and are
> therefore ranked lower.

So, basically you're giving sets of three parameters:
column value, your value, score for that column
and your query should return score for the sum of all
those values.  I'll assume you only use '=' -- if you use
other conditions, feel free to modify!

First, your example data:

qnex=# CREATE TABLE blah (foo text, bar text);
qnex=# INSERT INTO blah VALUES ('a','a');
qnex=# INSERT INTO blah VALUES ('a','b');
qnex=# INSERT INTO blah VALUES ('b','b');
qnex=# INSERT INTO blah VALUES ('c','c');

Second, a user defined scorecounter:

CREATE OR REPLACE FUNCTION scorecounter(colval text[], yourval text[],
score int[]) RETURNS int AS $$
  DECLARE
    i int DEFAULT 1;
    retscore int DEFAULT 0;
  BEGIN
    WHILE score[i] IS NOT NULL
    LOOP
      IF colval[i] = yourval[i] THEN
        retscore := retscore + score[i];
      END IF;
      i := i+1;
    END LOOP;
    RETURN retscore;
  END $$ LANGUAGE PLpgSQL;

I used PL/pgSQL but you may prefer to user perl instead -- the idea
stays the same.  And now for the grand finalle:

SELECT *, scorecounter(ARRAY[foo,bar], ARRAY['a','b'], ARRAY[42,20]) from blah;
 foo | bar | scorecounter
-----+-----+--------------
 a   | a   |           42
 a   | b   |           62
 b   | b   |           20
 c   | c   |            0

SELECT * FROM blah ORDER BY scorecounter(ARRAY[foo,bar],
ARRAY['a','b'], ARRAY[42,20]) DESC;
 foo | bar
-----+-----
 a   | b
 a   | a
 b   | b
 c   | c


Note that you should add some error checking into the function,
and if you prefer, you may user other syntax for arrays, I used
ARRAY[...] because it felt self explanatory.

Regards,
     Dawid

В списке pgsql-general по дате отправления:

Предыдущее
От: Matthias Luedtke
Дата:
Сообщение: Re: Modifying SQL parser with extensions?
Следующее
От: Alvaro Herrera
Дата:
Сообщение: Re: Modifying SQL parser with extensions?