在左连接中选择nvarchar'like' - 内连接组合

时间:2010-10-19 13:42:52

标签: sql sql-server sql-server-2008

我目前有一个基于一组动态条件返回结果的查询

DataTable Items:
    ID   Title
    1    Some title
    2    Some other title
..etc..

DataTable Tags:
    ID   Tag
    1    'a1c'
    1    'a1d'
    2    'a2c'
..etc..

我目前的搜索查询:

select * from dbo.Items i
LEFT JOIN dbo.tags t
on i.ID = t.ID
INNER JOIN @input in
on (in.[input] = t.Tag or in.[input] is null)

输入类似于:

DECLARE @input as inputTable_type
INSERT INTO @input VALUES ('a1c')

我想要做的是使用像'a1%'这样的值作为输入,但是当我尝试这个时,我没有得到任何结果(虽然我知道如下的查询确实有效):

select * from dbo.Items i
INNER JOIN dbo.tags t
on i.ID = t.ID
and t.Tag like ('a1%')

不幸的是,我想保持静态查询,据我所知,我需要LEFT JOIN - INNER JOIN组合,以便能够将VALUES (NULL)传递给存储过程。

感谢您的任何想法和帮助,如果我能澄清任何事情,请告诉我!

2 个答案:

答案 0 :(得分:2)

由于你已经在使用外连接表玩有趣的游戏,为什么不扩展游戏呢?最简单的版本是用LIKE替换相等;下一个最简单的版本是添加OR术语:

SELECT *
  FROM dbo.Items i
  LEFT JOIN dbo.tags t ON i.ID = t.ID
 INNER JOIN @input  in ON (t.Tag = in.[input] OR
                           t.Tag LIKE in.[input] OR
                           in.[input] IS NULL)

复杂的下一个等级(或者我的意思是'并发症'?)是在@input表中添加第二列,表示要执行的比较:

SELECT *
  FROM dbo.Items i
  LEFT JOIN dbo.tags t ON i.ID = t.ID
 INNER JOIN @input  in ON ((in.[type] = '=' AND t.Tag = in.[input]) OR
                           (in.[type] = '%' AND t.Tag LIKE in.[input]) OR
                           in.[input] IS NULL)

我选择调用额外列'type',其中的值是单个字符,使用'='表示相等连接,'%'表示LIKE连接。

答案 1 :(得分:1)

不是试图在你的@input表中存储'a1%',只存储'a1',我认为下面的(未经测试的)代码会给你你想要的东西。

select * 
    from dbo.Items i
        LEFT JOIN dbo.tags t
            INNER JOIN @input in
                on in.[input] = left(t.Tag, len(in.[input]))
            on i.ID = t.ID
    where (t.ID is not null or not exists(select 1 from @input))