2016-09-28 187 views
0

的一个子集我有一个看起来像一个表:SQL查询来匹配数据

CLASS VALUE 
1  A 
1  B 
1  C 
2  A 
2  C 
3  B 
3  D 
4  A 
5  C 
5  A 

我有一个用户提交的数据集,我要查找其值的子集的任何类值用户提交的数据集。

例如,

如果数据集为ABC那么结果将是1类,24,和5

如果数据集为AC结果会2类,45

如果数据集为A,则结果为4

我所使用的平台是SQL Server,但是真正的任何基于SQL的答案都是最好的。

+0

确切地说,用户提交的值格式化的方式是什么?它是一个字面上是“A,B和C”的扁平“VARCHAR”吗?还是将它作为表格传递给proc?该查询似乎很简单,但我们需要知道您如何处理用户输入。 – Siyual

+0

当然!它以表格形式传递。所以你可以使用IN子句,但我不确定在哪里或如何做到这一点。 – Jason

回答

1

作为每注释It's passed as a table. - 假设表是可变@UserInputValue单个列,则可以使用一个WHERE EXISTS子句来检查该值的在所述用户的存在输入字段,并拉取DISTINCTClass值。

Select Distinct Class 
From YourTable T 
Where Exists 
(
    Select * 
    From @UserInput U 
    Where T.Value = U.Value 
) 

您的SQL语法会有所不同,但这应该指向正确的方向,语法上。

的如何实现此将如下所示的完整例如:

创建用户定义的表类型

Create Type dbo.UserInput As Table 
(
    Value Varchar (10) 
) 
Go 

创建存储过程

Create Proc dbo.spGetClassesByUserInput 
(
    @UserInput dbo.UserInput ReadOnly 
) 
As Begin 
    Select Distinct Class 
    From YourTable T 
    Where Exists 
    (
     Select * 
     From @UserInput U 
     Where T.Value = U.Value 
    ) 
End 
Go 

用用户输入调用存储过程

Declare @Input dbo.UserInput 
Insert @Input 
Values ('A'), ('B'), ('C') 

Execute dbo.spGetClassesByUserInput @Input 
0

您可以创建一个存储过程,将用户条目作为字符串传递给ex。 A,B,C

Create Procedure dbo.GetClasses 
@v_UserEntry Varchar(200) 
As 
Begin 
    Declare @SQLQuery AS NVarchar(1000) 
    Declare @ParamDefinition AS NVarchar(300) 

    SET @v_UserEntry= REPLACE(@v_UserEntry,',',''',N''') 
    Set @SQLQuery ='Select Class' 
    Set @SQLQuery = @SQLQuery + ' From TableName' 
    Set @SQLQuery = @SQLQuery + ' Where Value in (N'''[email protected]_UserEntry+''')' 
    Set @SQLQuery = @SQLQuery + ' Group By Class'  
    Execute sp_executesql @SQLQuery 
End 
Go 
+0

刚刚对此进行了测试,但其中存在语法错误。我试着用“拥有”来代替,但它返回了一个错误... – Jason

+0

@Jason对不起,我更新了存储过程 – mbadeveloper