Sql 选择nvarchar';比如';在左联接-内联接组合中

Sql 选择nvarchar';比如';在左联接-内联接组合中,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我目前有一个查询,它根据一组动态条件返回结果 DataTable Items: ID Title 1 Some title 2 Some other title ..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)

我目前有一个查询,它根据一组动态条件返回结果

DataTable Items:
    ID   Title
    1    Some title
    2    Some other title
..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%”这样的值作为输入,但是当我尝试这样做时,我没有得到任何结果(尽管我知道下面这样的查询确实有效):

不幸的是,我想保持它为静态查询,据我所知,我需要左连接-内部连接组合,以便能够将
值(NULL)
传递到存储过程中


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

与其尝试在
@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))

既然你已经在用外部连接的桌子玩有趣的游戏,为什么不扩展游戏呢?最简单的版本是用LIKE替换等式;下一个最简单的版本是添加或术语:

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”,其中的值是单个字符,使用“=”表示相等联接,使用“%”表示相似联接。

在未指定的表上进行联接是个坏主意,这基本上是您要求执行的操作。如果你有两张桌子,a1a和a1b,你会加入哪一张?你同意不加入a1b吗?如果使用通配符,SQL不会为您添加额外的联接。@JNK-我想我的描述可能不够清楚,因为我试图大大简化我实际使用的查询。我将提供一个输入列表(这就是为什么它是在用户定义的表类型中),因此我将传递
'a1c','a1%','a2c'
等的输入。不,我理解,我想我得到的是,如果有两个表符合您的条件(因为您想使用类似的比较),您希望查询如何反应?它不会对同一条件下的多个表运行。感谢您的响应,这看起来很棒,因为它可以为我提供所需的结果,但是如果给定项目没有
标记
,我仍然在结果集中接收空值,尽管我已经指定了一个搜索依据的标记…@Brett:我添加了一个
where
子句,这应该会有所帮助。谢谢,是的,我做了类似的事情,在我发表评论之前我没有考虑太多。这个解决方案对我来说非常有效,但我想知道您是否能够解释将左连接的
条件置于内部连接之前与内部连接之后的I.ID=t.ID
条件之间的区别?我注意到,如果ON条件被移动,结果将在您的代码中包含来自
标记的空值,但不包括来自
标记的空值。@Brett:您可以将我编写的版本视为一个
左联接
到一个派生表,该派生表由另外两个
内部联接
组成(dbo.tags t internal JOIN@input in…
由于听起来您不希望在本例中使用空值,因此您的版本在本例中是合适的。
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)
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)