SQL语句中的临时变量

时间:2011-11-14 18:37:13

标签: mysql stored-procedures select sql-order-by

我在SQL中定义了一个函数来计算两个给定字符串之间的Levenshtein距离。

目前我以类似下面的方式调用此函数:

SELECT * FROM movies M WHERE levenshtein ( M.title, "Foobar" ) < 5;

我想按照levenshtein距离的升序使用结果,但不知道这样做的正确方法。

有没有办法做到这一点,还是我必须以不同的方式做到这一点?

4 个答案:

答案 0 :(得分:2)

levenshtein()是一项昂贵的功能。如果性能完全相关,您可能希望避免两次调用它。使用子选择。 (在其他RDBMS中,您可能使用CTE,但MySQL没有。)

运行测试以查看哪个表现更好。

SELECT some_col
FROM   (SELECT some_col, levenshtein(title, 'Foobar') AS levi FROM movies) AS m
WHERE  levi < 5
ORDER  BY levi;

BTW,你不想把表别名放在SELECT列表中,就像你的例子一样,是吗?

答案 1 :(得分:0)

ORDER BY levenshtein ( M.title, "Foobar" )

答案 2 :(得分:0)

我相信您可以在order by子句中重用该函数,如下所示:

SELECT *
FROM movies M
WHERE levenshtein ( M.title, "Foobar" ) < 5
ORDER BY levenshtein ( M.title, "Foobar" );

另一个选项是将所有记录的结果(通过添加函数调用列)输出到临时表,然后使用WHEREORDER BY子句从中选择在有问题的栏目上。

答案 3 :(得分:0)

对于寻找类似答案的人,我对同一类问题有一些实际经验。

虽然效果很好,但问题是......

ORDER BY levenshtein ( M.title, "Foobar" )

...并不是它执行两次函数(从对500,000行表进行测试,我不相信它),但查询使用filesort来执行ORDER BY。您可能知道,在WHERE子句中合并ORDERed列不需要filesort。问题是ORDERed值不是列,并且不像纯列引用那样工作。