我有一个查询,通过选择数据类型(color
,speed
)让某些人能够搜索记录,然后根据所选的数据点,他们可以提供搜索条件。
我很难找到如何更改WHERE
子句需要搜索的列,具体取决于所选的数据点。
这里是我尝试的一些示例代码:
DECLARE @dataType VARCHAR(10);
DECLARE @temp TABLE (color VARCHAR(20), speed VARCHAR(20));
DECLARE @data XML;
-- Insert Temp Data
INSERT INTO @temp( color, speed ) VALUES ( 'Red', 'Fast' )
INSERT INTO @temp( color, speed ) VALUES ( 'Blue', 'Slow' )
INSERT INTO @temp( color, speed ) VALUES ( 'Red', 'Snail' )
-- Test 1
SET @dataType = 'color';
SET @data = '<dataPoints><data><value>Red</value></data></dataPoints>'
-- Test 2
--SET @dataType = 'speed';
--SET @data = '<dataPoints><data><value>Fast</value></data></dataPoints>'
SELECT color,
speed
FROM @temp AS t
WHERE
CASE
WHEN
@dataType = 'color'
THEN
t.color IN (SELECT ParamValues.x1.value('value[1]', 'VARCHAR(60)') FROM @data.nodes('/dataPoints/data') AS ParamValues(x1))
WHEN
@dataType = 'speed'
THEN
t.speed IN (SELECT ParamValues.x1.value('value[1]', 'VARCHAR(60)') FROM @data.nodes('/dataPoints/data') AS ParamValues(x1))
END
我的思考过程是,根据所选的数据点,CASE WHEN
会告诉它查看特定的列。我不认为这是有效的,因为我的编辑抱怨语法。
处理此事的更好方法是什么?
答案 0 :(得分:2)
您可以尝试这样的事情:
WHERE (@dataType = 'color' AND t.color IN (SELECT ParamValues.x1.value('value[1]', 'VARCHAR(60)') FROM @data.nodes('/dataPoints/data') AS ParamValues(x1)))
OR(@dataType = 'speed' AND t.speed IN (SELECT ParamValues.x1.value('value[1]', 'VARCHAR(60)') FROM @data.nodes('/dataPoints/data') AS ParamValues(x1)))
答案 1 :(得分:0)
您可以使用动态汇编的查询。类似的东西:
DECLARE @dataType VARCHAR(10);
create TABLE #t (color VARCHAR(20), speed VARCHAR(20));
DECLARE @data XML;
declare @value VARCHAR(20)
declare @sql VARCHAR(max)
-- Insert Temp Data
INSERT INTO #t( color, speed ) VALUES ( 'Red', 'Fast' )
INSERT INTO #t( color, speed ) VALUES ( 'Blue', 'Slow' )
INSERT INTO #t( color, speed ) VALUES ( 'Red', 'Snail' )
---- Test 1
--SET @dataType = 'color';
--SET @data = '<dataPoints><data><value>Red</value></data></dataPoints>'
-- Test 2
SET @dataType = 'speed';
SET @data = '<dataPoints><data><value>Fast</value></data></dataPoints>'
SELECT @value = ParamValues.x1.value('value[1]', 'VARCHAR(60)') FROM @data.nodes('/dataPoints/data') AS ParamValues(x1)
set @sql = 'SELECT color,
speed
FROM #t AS t
WHERE ' + case @dataType when 'color' then ' t.color '
when 'speed' then ' t.speed ' else '' end
+' in (''' +@value + ''')'
print @sql
exec(@sql)
drop table #t