Фильтрация результирующего набора MySQL на основе возвращаемого значения функции - PullRequest
0 голосов
/ 22 марта 2010

Я новичок в SQL, и мне нужна небольшая помощь, чтобы понять общую картину того, возможно ли это, и если да, то как фильтровать набор результатов на основе возвращаемого значения функции, которая передаетсяодно из полей записи.

Допустим, у меня есть таблица с именем "Numbers", содержащая только одно поле: "Значение".

Как правильно указать следующее "псевдо-sql""?:

SELECT Value FROM numbers WHERE IsPrime(Value)=true

Могу ли я выполнить такую ​​задачу, и если да, то где / как я могу поместить / сохранить" IsPrime "?

Я использую MySQL.

Ответы [ 3 ]

1 голос
/ 22 марта 2010

Я ничего не знаю о пользовательских функциях, но я могу представить, что для функций, требующих большого объема вычислений, может быть лучше предварительно рассчитать это значение и сохранить его где-нибудь в базе данных.

В зависимости от того, как данные попадают в базу данных, вы можете потребовать, чтобы клиент вычислил isPrime (это можно сделать, если клиент является веб-службой или приложением на вашем собственном сервере), или, возможно, запланированное задание, которое обрабатывает каждую запись isPrime имеет значение null или что-то в этом роде. Это не мгновенно, но для некоторых сценариев может быть достаточно.

Если isPrime используется только иногда, вы можете также постобработать / отфильтровать данные на клиенте при получении данных.

1 голос
/ 22 марта 2010

Я согласен с extraneon, что обычно лучше хранить это значение в базе данных, а не вычислять его в предложении where. Таким образом, вы можете вычислить его один раз для каждой строки и проиндексировать данные для повышения производительности.

Пока вы используете MySQL 5.x, я бы рекомендовал хранимую функцию, а не UDF. Вы можете добавить столбец IS_PRIME типа TINYINT в свою БД, добавить индекс для этого столбца, а затем использовать сохраненную функцию для вычисления значения во время вставки. Вы даже можете вычислить значение IS_PRIME, используя триггер перед вставкой, если не хотите изменять код вставки.

Сохраненная функция будет выглядеть примерно так:

DELIMITER $$

DROP FUNCTION IF EXISTS IS_PRIME $$

CREATE FUNCTION IS_PRIME(P_INT BIGINT) RETURNS TINYINT
BEGIN
  DECLARE V_FACTOR BIGINT;
  DECLARE V_MAX_FACTOR BIGINT;

  SET V_FACTOR := 2;
  SET V_MAX_FACTOR := round(sqrt(P_INT),0);

  WHILE (V_FACTOR <= V_MAX_FACTOR)
  DO
    IF (P_INT % V_FACTOR) = 0
    THEN
      RETURN FALSE;
    END IF;
    SET V_FACTOR := V_FACTOR + 1;
  END WHILE;

  RETURN TRUE;

END $$

DELIMITER ;
1 голос
/ 22 марта 2010

Я думаю, что вы можете найти некоторую помощь с документом о пользовательских функциях: http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...