【问题标题】:How to query for multiple values in a single cell in SQL如何在 SQL 中查询单个单元格中的多个值
【发布时间】:2020-11-21 18:39:54
【问题描述】:

这里是新手。如果我没有使用正确的术语,请提前道歉。

情况:我正在使用我的第一个 SQL 数据库,并且一列中的单元格有多个值,其中许多值与其他单元格重叠。这是一段摘录(我是堆栈溢出的新手,还不能插入图像,我想不出用文本表示布局的最佳方式,但这是我最好的尝试):

 aardvark | animal mammal carnivore
 tiger    | animal carnivore mammal
 snail    | animal mollusk

问题:如何调用具有特定多个值组合但不一定按查询顺序的所有行?

期望结果的示例:使用上面列出的列/值,我只想提取第 2 列中同时具有“动物”和“哺乳动物”值的行(因此 row_1 和 row_2,但不是 row_3)。

失败/令人困惑的尝试示例(使用上面列出的列/值):

  • 如果我这样做:SELECT * FROM table_name WHERE col_name LIKE '%mammal%' AND '%animal%',则返回零行(无论是先列出 '%mammal%' 还是 '%animal%',都会发生这种情况)
  • 如果我执行SELECT * FROM table_name WHERE col_name LIKE '%animal%' OR '%mammal%',则会返回所有三行(我预计会发生这种情况,但是...)
  • 如果我在使用 OR (SELECT * FROM table_name WHERE col_name LIKE '%mammal%' OR '%animal%') 时切换 LIKE 条件,则仅返回第 1 行和第 2 行

SQL 是否支持这种查询?过去几天我一直在寻找解决方案,我得到的最接近的是我认为 ALL 可能与它有关,但如果是这种情况,我无法找出正确的语法。我环顾四周,发现了一些关于如何将多个列值组合到一个单元格中的文章,但没有找到如何搜索它们的文章。我考虑过重新格式化表格,以便该列每个单元格只有一个值,但这需要添加更多列来容纳所有值,而且这似乎会使搜索变得更加复杂,因为它需要搜索所有这些列,而不是只有一列。

谢谢!

【问题讨论】:

  • 请阅读stackoverflow.com/questions/3653462/… amd 尝试规范化数据库,这样会更容易。如果你有固定数量的值,你可以尝试一些东西,所以你必须为此使用一个函数
  • WHERE col_name LIKE '%mammal%' AND col_name LIKE '%animal%'
  • 考虑规范化你的架构

标签: mysql sql search


【解决方案1】:

首先,您应该了解您的数据模型已损坏。在一个字符串中存储多个值根本不是在数据库中存储数据的正确方法。您应该有一个表格,每个动物和特征有一排。

也就是说,有时我们会被其他人非常非常糟糕的决定所困扰。您可以使用like 处理这种情况。最简单的方法是:

where col_name like '%mammal%' and col_name like '%animal%'

但是,这有一个问题,因为您没有考虑分隔符 - 您可能希望“ant”匹配“anteater”。所以:

where concat(' ', col_name, ' ') like '% mammal %' and
      concat(' ', col_name, ' ') like '% animal %'
      

【讨论】:

    【解决方案2】:

    这是一种通用方法,适用于任何数据库,无需修改架构或数据。然而,它的表现不会很好。 (如果您的数据库支持,您也可以考虑使用 RegEx 方法。)

    理想情况下,您应该规范化架构,但这通常是不可能的。

    要查找同时具有mammalcarnivore 的记录:

    select ...
    from ...
    WHERE (col_name = 'mammal'
            or col_name like 'mammal %'
            or col_name like '% mammal %'
            or col_name like '% mammal')
        and (col_name = 'carnivore'
            or col_name like 'carnivore%'
            or col_name like '% carnivore%'
            or col_name like '% carnivore')
    

    【讨论】:

      猜你喜欢
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多