【问题标题】:SQL Query to match a subset of data用于匹配数据子集的 SQL 查询
【发布时间】:2016-09-28 20:42:39
【问题描述】:

我有一个看起来像这样的表:

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

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

例如,

如果数据集是ABC,则结果将是1245 类。

如果数据集是 AC,则结果将是类 245

如果数据集是A,那么结果就是类4

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

【问题讨论】:

  • 用户提交的值究竟是如何格式化的?是 VARCHAR 的字面意思是 'A, B, and C' 吗?还是将其作为表格传递给proc?查询看起来很简单,但我们需要知道您是如何处理用户输入的。
  • 当然!它作为表格传递。所以你可以使用 IN 子句,但我不确定在哪里或如何做到这一点。

标签: sql sql-server pattern-matching


【解决方案1】:

根据评论It's passed as a table. - 假设表是变量@UserInputValue 的单列,您可以使用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

【讨论】:

    【解决方案2】:

    您可以创建一个存储过程,并将用户条目作为 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
    

    【讨论】:

    • 刚刚测试了这个,但是在 Where 上有语法错误。我用“有”来尝试它,但它返回了一个错误......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多