繁体   English   中英

如何在SQL中查询单个单元格中的多个值

[英]How to query for multiple values in a single cell in SQL

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

情况:我正在使用我的第一个 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 可能与它有关,但如果是这种情况,我一直无法找出正确的语法。 我环顾四周,发现了一些关于如何将多个列值组合到一个单元格中的文章,但没有找到有关如何搜索它们的文章。 我考虑重新格式化表格,以便每个单元格的列只有一个值,但这需要添加更多列来容纳所有值,而且这似乎会使搜索变得更加复杂,因为它需要搜索所有那些列而不是一列。

谢谢!

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

也就是说,有时我们会被其他人非常非常糟糕的决定所困。 您可以使用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 %'
      

这是一种通用方法,可以在不修改架构或数据的情况下使用任何数据库。 然而,它不会表现得很好。 (如果您的数据库支持,您也可以考虑使用 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM