TSQL WHERE子句依赖于变量datapoint

时间:2018-04-03 17:05:49

标签: sql sql-server stored-procedures

我有一个查询,通过选择数据类型(colorspeed)让某些人能够搜索记录,然后根据所选的数据点,他们可以提供搜索条件。

我很难找到如何更改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会告诉它查看特定的列。我不认为这是有效的,因为我的编辑抱怨语法。

处理此事的更好方法是什么?

2 个答案:

答案 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