我在SQL 2005表中有数据如下。
Table Name: FilterData CategoryID ColumnID AnswerCode -------------------------------- 0349 Q15 02 0349 Q15 03 0349 Q16 04
Table Name: TransactionData CategoryID Q15 --------------------------------- 0349 01 0349 02 0349 03 0349 04 0349 05 0349 06
FilterData表包含有关用于过滤TransactionData上的select语句的列的信息。因此,当我从TransactionData执行Select *时,我想从FilterData表构建Where子句,以便我可以在TransactionData表上为该CategoryID触发它。
有人可以帮助我,我该怎么做?
答案 0 :(得分:2)
如果我理解你的问题,下面的代码应该有效。请注意,我已经创建了一个函数来帮助字符串连接。我不确定你是否想和你或你的条件。我在我的样本中使用了AND。如果合适,您可以轻松地将其调整为OR。
/* Set up sample data */
create table FilterData (
CategoryID char(4),
ColumnID char(3),
AnswerCode char(2)
)
insert into FilterData
(CategoryID, ColumnID, AnswerCode)
values
('0349','Q15','02')
insert into FilterData
(CategoryID, ColumnID, AnswerCode)
values
('0349','Q15','03')
insert into FilterData
(CategoryID, ColumnID, AnswerCode)
values
('0349','Q16','04')
go
/* Helper function to concatenate all AnswerCodes for a given ColumnID */
create function dbo.fnStringAnswerCodes(@ColumnID char(3))
returns varchar(1000)
as
begin
declare @CodeString varchar(1000)
set @CodeString = @ColumnID + ' in ('
select @CodeString = @CodeString + '''' + AnswerCode + ''','
from FilterData
where ColumnID = @ColumnID
/* Remove trailing comma and add closing parens */
select @CodeString = left(@CodeString, len(@CodeString)-1) + ')'
return @CodeString
end
go
declare @CategoryID char(4)
declare @SQLString varchar(1000)
declare @WhereClause varchar(1000)
set @CategoryID = '0349'
set @SQLString = 'select * from TransactionData '
set @WhereClause = 'where CategoryID=''' + @CategoryID + ''' and '
select @WhereClause = @WhereClause + dbo.fnStringAnswerCodes(ColumnID) + ' and '
from FilterData
where CategoryID = @CategoryID
group by ColumnID
/* Remove Trailing 'AND' */
set @WhereClause = LEFT(@WhereClause, len(@WhereClause)-3)
set @SQLString = @SQLString + @WhereClause
select @SQLString
/* Last step would be to dynamically execute the string we built */
/* exec sp_ExecuteSQL @SQLString */
/* Clean Up */
drop function dbo.fnStringAnswerCodes
drop table FilterData
答案 1 :(得分:0)
这是上述标准的where子句。但是,您需要通过动态阐明您的意思吗?你会收到2套两个标准 - 即(Q15和'02','03')和('Q16'和'04')?此外,您应该使用这些查询参数来阻止SQL注入。
哪里
(
ColumnId ='Q15'和AnswerCode IN('02','03')
)
OR
(
ColumnId ='Q16'和AnswerCode IN('04')
)