【问题标题】:TSQL - How to search a string in multiple rows?TSQL - 如何在多行中搜索字符串?
【发布时间】:2015-08-21 02:56:57
【问题描述】:

我不确定如何让 SQL 完成我想要解决的问题。我有一个学生,根据他们的年级,将在三所学校中的一所(学生)。

我只需要根据年级返回学生当前所在学校的 StudentID 和 SchoolID。请问这种方式怎么搜索?

期望结果(学生在 12 年级,因此 SchoolID 为 500):

SQL Fiddle

谢谢。

【问题讨论】:

  • 这个设计实在是太糟糕了。它是可怕的非规范化并且几乎在每一步都违反了规范化。学生当前成绩应保存在学生记录中,不得保存在其他任何地方。您违反了 1NF,因为您在提供成绩的单列中有多个数据点。
  • 我同意,这不是我的设计,我不在一个会改变它的部门。这是从结合多个地方的数据的视图中获取的。可能不是最好的例子,但这是我必须使用的。我们确实必须跟踪每个 schoolID 提供的成绩。例如,有些学校没有 01,02 年级,而其他学校则有 01 到 05 年级。
  • 学生的当前成绩保存在标准化表格和其他视图中的学生记录中。正是我正在处理的这个特殊视图将学校提供的所有成绩放在一个列中。
  • 啊,一个观点……至少解释了那部分。可能也解释了所提供的成绩的分隔混乱。你有没有机会直接点击基表而不是使用这个视图?它会让你的生活轻松很多。搜索分隔数据时,您要么必须将其解析回行,要么执行非 SARGable 通配符 LIKE 搜索。
  • 然后查看视图,看看数据是否正确规范化了一些地方

标签: sql sql-server tsql


【解决方案1】:
where GradesOfferedInSchool like '%' + cast(StudentCurrentGrade as varchar(max)) + '%'

但这是一个糟糕的数据设计
一列中不应有多个值

这仍然只是一个 hack,因为它会找到 '12b'

如果这是一个视图,则查找规范化数据
更好,但仍然是一个黑客

 where GradesOfferedInSchool like '% ' + cast(StudentCurrentGrade as varchar(max)) + ', %'
    or GradesOfferedInSchool like cast(StudentCurrentGrade as varchar(max)) + ', %'
    or GradesOfferedInSchool like '%, ' + cast(StudentCurrentGrade as varchar(max))
    or GradesOfferedInSchool = cast(StudentCurrentGrade as varchar(max))

【讨论】:

  • sqlfiddle.com/#!6/caa7d/13 使用此解决方案(使用 CONCAT() 代替,但想法相同)
  • @Frisbee,我不反对,这是一个继承的设计。所以我理解逻辑,您告诉 WHERE 子句在 GradesOfferedInSchool 列中查找 StudentCurrentGrade 列中匹配的所有内容。你会这么说这里发生的事情吗?感谢您的帮助。
  • '%' 只是一个通配符,所以在字符串中的任何位置
【解决方案2】:

这适用于我使用 Microsoft SQL Server。 CAST 是必需的,否则会由于字段的数据类型不同而引发错误。

SELECT
 StudentID,
 SchoolID

FROM dbo.StudentFeederPatterns
WHERE GradesOfferedInSchool LIKE '%' + CAST(StudentCurrentGrade AS VARCHAR) + '%'

SQL Fiddle

【讨论】:

    【解决方案3】:

    奇怪的是为什么你在 [StudentCurrentGrade] 上做 INT,而 'PK' 和 'KK' 是它的选项 无论如何:

    SELECT [StudentID]
         , [SchoolID]
         , [GradesOfferedInSchool]
         , [StudentCurrentGrade]
      FROM [dbo].[StudentFeederPatterns]
     WHERE CHARINDEX( CAST([StudentCurrentGrade] AS VARCHAR)
                      , [GradesOfferedInSchool]) > 0
    

    【讨论】:

    • 关于 INT,12 年级是样本中给出的唯一数据,但我确实明白你的意思。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多