【问题标题】:Using Where in a query with a function在带有函数的查询中使用 Where
【发布时间】:2010-12-26 22:53:30
【问题描述】:
 SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) FROM theTable

如何在此处将WHERE 添加到函数dbo.myFunc 的结果中,例如WHERE resultOfMyFunc > 10

【问题讨论】:

  • 通常通过使用您正在使用的特定 RDBMS 标记您的问题来获得更多点击。

标签: sql function sql-server-2005 filtering


【解决方案1】:

为了上帝的爱。 拥有 选择 col1, col2, dbo.myFunc(@param1, @param2, col1, col2) 从表 其中 dbo.myFunc(@param1, @param2, col1, col2) > 10

select col1, col2, dbo.myFunc(@param1, @param2, col1, col2) as calculated
FROM theTable
HAVING calculated > 10

【讨论】:

  • 无法让它以这种方式工作,您能否尝试以这种方式重写我的函数?
  • 仍然不起作用,它为我为别名做了 AS 的列提供了“无效列”。
  • 不确定您使用的是哪种 sql 风格。聚合函数结果的条件通常在 have 子句上,而不是 where 子句上。我建议阅读您使用的 sql 风格的适当文档
【解决方案2】:

只需使用您在查询中的选择中使用的确切函数调用 - 查询优化器应该缓存该值并在两个地方使用它而不重新评估该函数(至少对于 MSSQL 是这样)。

例如,

SELECT col1, col2, myFunc(@arg1, @arg2, col1, col2)
FROM myTable
WHERE myFunc(@arg1, @arg2, col1, col2) > 10

【讨论】:

    【解决方案3】:

    只是添加到以前的答案以涵盖另一个选项...

    如果您不想在 WHERE 子句中重复函数调用(例如,它需要许多参数并使查询在您眼中的可读性降低),您可以这样做:

    SELECT * FROM
    (
    SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) As funcResult
    FROM theTable
    ) x
    WHERE x.funcResult > 10
    

    【讨论】:

      【解决方案4】:

      您可以像在 SELECT 中一样使用它:

      WHERE
           dbo.myFunc(@param1, @param2, col1, col2) > 10
      

      【讨论】:

        【解决方案5】:
        select col1, col2, dbo.myFunc(@param1, @param2, col1, col2)
        from theTable
        where dbo.myFunc(@param1, @param2, col1, col2) > 10
        

        或者(不确定第二个是否适用于所有 SQL 版本)

        select col1, col2, dbo.myFunc(@param1, @param2, col1, col2) as funcVal
        from theTable
        where funcVal > 10
        

        【讨论】:

        • 是的,这让我在使用 MSSQL 时一直感到沮丧。我一直希望他们允许在 WHERE 表达式中使用列别名,但可惜现在还没有(也许这在 2008 年有效?我还在 2005 年)。
        • 我刚刚在 2008 年做了一个简单的测试,看起来你不能在 WHERE 子句中使用列别名。
        【解决方案6】:

        试试

        SELECT 
            col1, 
            col2, 
            dbo.myFunc(@param1, @param2, col1, col2) AS result
        FROM 
            theTable
        WHERE
            result > 10;
        

        最好的祝愿,
        费边

        【讨论】:

        • 没有,但我希望这会起作用,它看起来比重复该功能和所有功能要好得多。
        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多