我目前有一个基于一组动态条件返回结果的查询
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)
传递给存储过程。
感谢您的任何想法和帮助,如果我能澄清任何事情,请告诉我!
答案 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))