很抱歉很长的帖子,但大部分是代码拼写我的方案:
我正在尝试执行动态查询(希望通过存储的进程)来根据可变数量的输入检索结果。
如果我有一张桌子:
(dbo).(People)
ID Name Age
1 Joe 28
2 Bob 32
3 Alan 26
4 Joe 27
我想允许用户按三列中的任何一列进行搜索,没问题:
DECLARE @ID int, @Name nvarchar(25), @Age int
SET @ID = 1
SET @Name = 'Joe'
SET @Age = null
SELECT *
FROM dbo.People
WHERE
(ID = @ID or @ID is null) AND
(Name like @Name or @Name is null) AND
(Age = @Age or @Age is null)
我检索到我想要的结果。
现在,如果我想在列中搜索多个字段,我可以做到这一点没问题:
DECLARE @text nvarchar(100)
SET @text = '1, 3'
DECLARE @ids AS TABLE (n int NOT NULL PRIMARY KEY)
--//parse the string into a table
DECLARE @TempString nvarchar(300), @Pos int
SET @text = LTRIM(RTRIM(@text))+ ','
SET @Pos = CHARINDEX(',', @text, 1)
IF REPLACE(@text, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @TempString = LTRIM(RTRIM(LEFT(@text, @Pos - 1)))
IF @TempString <> '' --just: IF @TempString != ''
BEGIN
INSERT INTO @ids VALUES (@TempString)
END
SET @text = RIGHT(@text, LEN(@text) - @Pos)
SET @Pos = CHARINDEX(',', @text, 1)
END
END
SELECT *
FROM dbo.People
WHERE
ID IN (SELECT n FROM @ids)
现在,我的问题是我似乎无法弄清楚如何将两者结合起来,因为我不能放:
WHERE
(Name like @Name or @Name is null) AND
(Id IN (SELECT n FROM @ids) or @ids is null)
因为@ids永远不会为null(因为它是一个表)
非常感谢任何帮助!
提前致谢...让我知道我是否可以澄清任何事情
答案 0 :(得分:1)
您可以使用IF语句:
IF LEN(@ids) > 0
BEGIN
SELECT *
FROM dbo.People
WHERE ID IN (SELECT n FROM @ids)
END
ELSE
BEGIN
SELECT *
FROM dbo.People
END
否则,consider making the query real dynamic SQL (minding pitfalls of course)。
答案 1 :(得分:0)
您可以尝试:
NOT EXISTS (SELECT 1 FROM @ids)
OR EXISTS (SELECT 1 FROM @ids where n = Id)
但是这些更好的是小表 - 这个查询可能不会很好地与你表上的任何索引一起使用。
答案 2 :(得分:0)
尝试:
(Id IN (SELECT n FROM @ids) OR NOT EXISTS (SELECT * FROM @ids))
答案 3 :(得分:0)
快速修复:
(`%,' + Id + ',%' like ',' + @ids + ',' or @ids is null)
and (`%,' + Name + ',%' like ',' + @names + ',' or @names is null)
因此,如果用户通过@ids = 1,2
,则第一行会显示:
`%,1,%' like ',1,2,'
在逗号之前和之后过滤空格是个好主意。 :)