SQL Query匹配数据子集

时间:2016-09-28 20:42:39

标签: sql sql-server pattern-matching

我有一张表格如下:

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

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

例如,

如果数据集为ABC,则结果将为124,和5

如果数据集为AC,则结果将为245

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

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

2 个答案:

答案 0 :(得分:1)

根据评论It's passed as a table. - 假设表是变量@UserInput且单个列Value,您可以使用WHERE EXISTS子句检查是否存在在用户输入字段中输入该值,并提取DISTINCT Class值。

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

答案 1 :(得分: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'''+@v_UserEntry+''')'
    Set @SQLQuery = @SQLQuery + ' Group By Class'    
    Execute sp_executesql @SQLQuery
End
Go