1

我在 SQL 中有一个函数,它根据输入参数对多个表中的一个执行检查。例如

CREATE FUNCTION demo
(
    @Classification INT,
    @ClassificationValue INT
)
RETURNS INT
AS
BEGIN

    IF @Classification = 1
    BEGIN
        IF EXISTS (SELECT CountryRegionId FROM table_1 WHERE id = @ClassificationValue)
        BEGIN
            RETURN 1;
        END
    END 
    IF @Classification = 2
    BEGIN
        IF EXISTS (SELECT CountryRegionId FROM table_2 WHERE id = @ClassificationValue)
        BEGIN
            RETURN 1;
        END
    END 
    RETURN 0;
END

这是一种简化的情况,实际上有更多的目标表可供选择。

我的问题

在 C# 或大多数其他语言中,最好使用 switch 语句而不是连续的 if 语句,因为会使用散列。这在 SQL 中是否相同(假设 case 语句可以包含逻辑表达式 - 例如 Case When a <5 - 显然不能被散列。

4

1 回答 1

3

if本质上讲,比较的成本与语句的成本相比没有任何意义exists——即使在适当的键上有索引也是如此。

除非您确实有成千上万的比较,否则不要担心这种微优化。

在这种情况下,我首先建议按照最有可能匹配的顺序对比较进行排序。然后,我建议研究一种替代数据结构,您可以在其中比较单个表中的 id。拥有如此相似的表通常表明您可以使用更少的大表来改进数据结构。

最后,如果您真的关心比较的数量,请使用 nested ifs 进行O(log n)比较。例如,“8”比较将具有以下结构:

if @Classification < 5
    if @Classification < 3
        if @Classification = 1
        else . . .
    else if @Classification = 3 . . .
    else . . .
else . . .
于 2013-07-05T14:05:26.503 回答