Sql server 在返回字符串或null的查询中使用函数

Sql server 在返回字符串或null的查询中使用函数,sql-server,join,function,Sql Server,Join,Function,我想加入用户id和应用id上的两个表“地址”和“用户信息” 哪一个是数字,或者它是空的,如以下两个示例: select * from user_info left outer join addresses on addresses.user_id = user_info.user_id and addresses.app_id is null select * from user_info left outer join addresses on addresses.user_id =

我想加入用户id和应用id上的两个表“地址”和“用户信息” 哪一个是数字,或者它是空的,如以下两个示例:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id is null

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id = 1234
app_id应该是什么很复杂,我已经编写了一个函数来返回它。它返回一个字符串,例如为null或=1234。 我试图用以下语法调用它:

select * from user_info 
left outer join addresses on addresses.user_id = user_info.user_id 
and addresses.app_id dbo.fnGetAppId(addresses.user_id)
我得到这个错误:

Msg 4145,15级,状态1,第3行 非布尔型表达式 在上下文中指定,其中 条件是预期的,在“dbo”附近

我希望保持查询非常简单,而不必确定函数是否返回null

你能建议最好的方法保持呼叫查询非常简单吗


我在sql server 2005中。

看起来您只是缺少了一个=符号

addresses.app_id dbo.fngetappidaddress.user_id

而不是


addresses.app_id=dbo.fngetappidaddress.user_id

那么如果fnGetAppId为null,那么此查询如下所示

select * from user_info left outer join addresses on addresses.user_id = user_info.user_id and null
我怀疑这是你想要的

在调用查询之前,您可能希望在逻辑中执行一个简单的检查,以正确处理fnGetAppId的null,正如Clyde所提到的,您还需要一个=符号来表示非null


.

NULL!=无效的如果address.app_id=NULL或fnGetAppID=NULL,比较将失败。我将把比较写为:


coalesceaddress.app_id,“NULLSTRING”=coalescedbo.fngetappidaddress.user_id,“NULLSTRING”

正如詹姆斯·布莱克所指出的,您拥有并且可能想要在哪里。除此之外,我建议您将函数设置为一个布尔函数,并将address.app_id作为另一个参数传递给它,这样它就可以执行IS NULL或=1234(视情况而定)。Bill的合并解决方案确实很聪明,但在函数中进行适当的比较更为简单,我想。

谢谢您的回答。但是你能回答我在给卢克的评论中提出的问题吗?随着我开始理解它,这看起来开始很有趣了。谢谢。所有的回答都很有教育意义,但这是最好的。谢谢