如何在 SQL Server where 子句中使用表值函数

Posted

技术标签:

【中文标题】如何在 SQL Server where 子句中使用表值函数【英文标题】:How can I use table-valued function in SQL Server where clause 【发布时间】:2015-08-12 10:49:59 【问题描述】:

我有一个表值函数,它返回一组 id 数据。我想把函数放在我的查询中;

SELECT * 
FROM caritbl 
WHERE cari_id IN (dbo.fn_AtamaliCariListe(37))

有什么建议吗?

编辑:我正在使用 SQL Server

【问题讨论】:

对不起,我忘了提。我修改了我的问题,你现在可以看到了。 【参考方案1】:

在这种情况下,您可以像使用表格一样使用此功能。通常你会像这样执行查询编写;

select * from XTable x where x.col in (select y.col from YTable y)

当你使用表值函数时,你也可以这样做;

select * from XTable x where x.col in (select y.col from dbo.fn_YourFunction(idparameter) y)

并不是你的表值函数应该返回一个名为“col”的列的结果

【讨论】:

【参考方案2】:

只需对函数执行 SELECT 即可。

  --Sample Table
  SELECT 12 AS A
  INTO #Temp

  --Query here
  SELECT * FROM #Temp WHERE A IN(
  SELECT [transform].[Maximum] (10,12)) 

这应该可以解决问题

【讨论】:

【参考方案3】:

Aykut 的答案是大多数情况下的最佳答案。这是要注意等效的joinin 更复杂。应该是:

SELECT DISTINCT c.*
FROM caritbl c JOIN
     dbo.fn_AtamaliCariListe(37) as acl(id)
     ON c.cari_id = acl.id;

注意DISTINCT。除非我们知道函数返回唯一值,否则我们需要它。

现在,在某些情况下JOIN 实际上更好。如果函数是不确定的,SQL Server 可能会为IN 处理的每一行重复重新评估它。我不知道 SQL Server 是否会这样做,但这是可能的。 JOIN 确实保证该函数只被评估一次。

【讨论】:

【参考方案4】:

你可以随时加入。

select yourfields
from yourtable join yourfunction on something
where whatever

这在逻辑上等价于你说你想做的。

【讨论】:

以上是关于如何在 SQL Server where 子句中使用表值函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 的 Where 子句中使用 case 语句

如何在 SQL Server where 子句中使用表值函数

如何在 SQL Server 2008 的 where 子句中仅比较日期并忽略时间

XML 值的 SQL Server Where 子句路径

SQL Server:如何将 UNION 与两个都有 WHERE 子句的查询一起使用?

SQL Server If 条件在 where 子句?