首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于参数值的T SQL条件连接

基于参数值的T SQL条件连接
EN

Stack Overflow用户
提问于 2012-02-07 03:43:50
回答 3查看 10.2K关注 0票数 2

我需要一个基于存储过程中参数的值的内部联接。我还使用了一个函数从逗号分隔值的字符串中拆分值。我的代码如下

代码语言:javascript
运行
复制
Select *
from view_Project as vp
join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL)

如果@earmark为NULL,那么我根本不希望这个连接发生,否则如果我有一个字符串'%‘、'119’或'119,120,121‘,这个连接就会发生,并产生正确的结果。我只是希望在@earmark为null的情况下根本不会发生这种情况,我想我可以使用and @earmark is not null来描述它没有返回正确的结果,这是通过注释连接行并运行与@earmark参数相同的带有null的存储过程来发现的,这将为我提供所有的行。当我保持这个连接并传递null时,我没有得到任何行,我已经处理这个问题有一段时间了,任何帮助都将不胜感激。

下面是函数:

代码语言:javascript
运行
复制
[inline_split_me](@param nvarchar(MAX))
RETURNS TABLE AS
RETURN(SELECT ltrim(rtrim(convert(nvarchar(4000),
    substring(@param, Number,
        charindex(N',' COLLATE SQL_Latin1_General_CP1_CI_AS,
        @param + convert(nvarchar(MAX), N','),
    Number) -
Number)
))) AS Value
   FROM   APM_Numbers
   WHERE  Number <= convert(int, len(@param))
     AND  substring(convert(nvarchar(MAX), N',') + @param, Number, 1) =
                    N',' COLLATE SQL_Latin1_General_CP1_CI_AS)

明白了,谢谢Cade Roux和其他人

代码语言:javascript
运行
复制
if (@earmark = '%')
select *
    from view_Project as vp
    where vp.EarmarkId like @earmark
else
select *
    from view_Project as vp
    where @earmark is null or vp.EarmarkId in (select Value from inline_split_me(@earmark))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-07 03:51:06

内连接是你的问题。LEFT JOIN总是返回左边的行,即使当@earmark为NULL时,join条件永远不会为真。

代码语言:javascript
运行
复制
Select *
from view_Project as vp
LEFT join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL)

当@earmark为NULL时,您可以使用UNION来制造要连接的行

代码语言:javascript
运行
复制
Select *
from view_Project as vp
INNER join (
    SELECT Value, -- columns here ...
    FROM inline_split_me(@earmark) as e
    UNION ALL
    SELECT DISTINCT vp.EarmarkId AS Value, -- NULL, NULL, etc.
    FROM view_Project
    WHERE @earmark IS NULL
) AS e
    ON vp.EarmarkId LIKE e.Value

但坦率地说,我只会做一个条件逻辑:

代码语言:javascript
运行
复制
IF @earmark IS NULL
    Select *
    from view_Project as vp
ELSE
    Select *
    from view_Project as vp
    INNER join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL)

如果你能摆脱像这样的事情:

代码语言:javascript
运行
复制
Select *
from view_Project as vp
WHERE @earmark IS NULL OR vp.EarmarkId IN (
    SELECT Value FROM inline_split_me(@earmark)
)
票数 4
EN

Stack Overflow用户

发布于 2012-02-07 03:51:53

...as vp join lined_split_me(@earmark) as...应该缺省为内连接,这意味着如果在两个表之间找到匹配,则查询只返回行。(通过显式地声明inner join来仔细检查。)

如果@earmark为null,函数调用是否不返回(零)行?如果是这样,那么查询应该不会返回任何行。

票数 0
EN

Stack Overflow用户

发布于 2021-03-18 23:16:19

我知道这个问题很老了,但我在研究类似的问题时遇到了这个问题,并提出了一个完全不同的解决方案,效果非常好。

使用左连接,但是在WHERE子句中有一个过滤器,如果参数不是null,那么连接匹配也不能是null。这在功能上会导致条件内联接。

代码语言:javascript
运行
复制
SELECT *
FROM 
  A 
  LEFT JOIN B 
    ON A.KEY = B.KEY
WHERE 
  (@JOIN_B IS NOT NULL AND B.KEY IS NOT NULL)
  OR @JOIN_B IS NULL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9166196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档