如何在 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 的答案是大多数情况下的最佳答案。这是要注意等效的join
比in
更复杂。应该是:
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 子句中仅比较日期并忽略时间