2

当条件本身是正在查询的表上的字段值时,如何在 SQL 中进行动态比较。

以下是我正在寻找的示例脚本。该脚本用于根据特定条件将学生分组。

  DECLARE @GroupCondition TABLE
  (
      GroupID Int
      ,Condition NVARCHAR(MAX)
  )

  INSERT INTO @GroupCondition VALUES(1,'History < 80 OR Maths > 90 ')
  INSERT INTO @GroupCondition VALUES(2,'Science < 90 OR Maths = 100 ')

  SELECT 
    CASE WHEN G.Condition THEN 1 ELSE 0 END [GroupResult]
    ,S.Name,G.GroupID
  FROM StudentMarks S , @GroupCondition G

在上面的select查询中,我们能不能得到G.Condition的实际要框的条件??

4

2 回答 2

3

注意:可能有更好的方法来执行您在此处尝试执行的操作,但这可以使用动态 sql:

--create table ##studentmarks (Name varchar(100),History int,Science int,Maths int);

--insert ##studentmarks select 'a',70,95,95;
--insert ##studentmarks select 'b',90,75,50;
--insert ##studentmarks select 'c',90,75,100;

declare @sql nvarchar(max)='';

 DECLARE @GroupCondition TABLE
  (
      GroupID Int
      ,Condition NVARCHAR(MAX)
  )

  INSERT INTO @GroupCondition VALUES(1,'History < 80 OR Maths > 90 ')
  INSERT INTO @GroupCondition VALUES(2,'Science < 90 OR Maths = 100 ');

select @sql=@sql+case when @sql!='' then ' union all ' else '' end+'select name,GroupID='+cast(GroupID as varchar)+',InGroup=case when '+condition+' then 1 else 0 end from ##studentmarks'
from @Groupcondition

exec(@sql);
于 2013-09-10T14:31:36.453 回答
0

假设您的 StudentMarks 表有列“历史”、“数学”、“科学”以及相应的成绩,只需像这样重写您的 CASE 语句:

CASE WHEN History < 80 OR Maths > 90 THEN 1
WHEN Science < 90 OR Maths = 100 THEN 2
    ELSE 0 END [GroupResult]

这将导致结束查询:

SELECT 
 CASE WHEN History < 80 OR Maths > 90 THEN 1
WHEN Science < 90 OR Maths = 100 THEN 2
ELSE 0 END [GroupResult]
,S.Name

FROM StudentMarks S
于 2013-09-10T14:40:29.797 回答