如何在SQL中查找记录之间的公共值?

如何在SQL中查找记录之间的公共值?,sql,Sql,有一个小问题,如果我有一个使用SQL的数据库: Names: Max¦ John¦ May¦ Olivia Numbers: 3, 7, 9¦ 1, 3, 4¦ 8, 5, 3¦ 5, 7, 1 有没有一种方法可以使用SQL检查“数字”列以查看有多少人喜欢数字5,然后向用户显示他们的姓名(喜欢数字的人)。以下是不将数字存储在字符串中的一些原因: SQL有一个很好的数据结构来存储列表。它被称为表,而不是字符串。 SQL的字符串处理能力相对较差。 对字符串使用筛选器的查询通常不能使用索引。 数字

有一个小问题,如果我有一个使用SQL的数据库:

Names: Max¦ John¦ May¦ Olivia

Numbers: 3, 7, 9¦ 1, 3, 4¦ 8, 5, 3¦ 5, 7, 1

有没有一种方法可以使用SQL检查“数字”列以查看有多少人喜欢数字5,然后向用户显示他们的姓名(喜欢数字的人)。

以下是不将数字存储在字符串中的一些原因:

SQL有一个很好的数据结构来存储列表。它被称为表,而不是字符串。 SQL的字符串处理能力相对较差。 对字符串使用筛选器的查询通常不能使用索引。 数字应存储在适当的数据类型中,即数字,而不是字符串。 如果数字是另一个表中的ID,则不能声明外键关系。 如果您只想在字符串中查找5,可以使用以下命令:

这可能不符合您的要求,因为它将匹配5到15。尽管这是可以修复的,但请返回并理解为什么不应该以这种方式存储数据。相反,您需要一个如下所示的表:

Name    Number
Max        3
Max        7
Max        9
John       1
. . .

首先,您的数据库设计很糟糕,但如果您仍想继续,请看下面的方法:

SELECT *
FROM YourTableName
WHERE Numbers LIKE '%5%';
结果:

+--------+---------+
|  Name  | Numbers |
+--------+---------+
| May    | 8, 5, 3 |
| Olivia | 5, 7, 1 |
+--------+---------+
+--------+--------+
|  Name  | Number |
+--------+--------+
| May    |      5 |
| Olivia |      5 |
+--------+--------+
但我建议将该设计更改为:

DECLARE @Names TABLE ( ID INT IDENTITY(1,1), Name VARCHAR(30) );
DECLARE @Numbers TABLE ( Name INT, Number INT);

INSERT INTO @Names VALUES
('Max'),
('John'),
('May'),
('Olivia');
INSERT INTO @Numbers VALUES
(1, 3),
(1, 7),
(1, 9),
(2, 1),
(2, 3),
(2, 4),
(3, 8),
(3, 5),
(3, 3),
(4, 5),
(4, 7),
(4, 1);
/**/
SELECT N.Name, NM.Number
FROM @Names N INNER JOIN @Numbers NM ON N.ID = NM.Name
WHERE NM.Number = 5;
结果:

+--------+---------+
|  Name  | Numbers |
+--------+---------+
| May    | 8, 5, 3 |
| Olivia | 5, 7, 1 |
+--------+---------+
+--------+--------+
|  Name  | Number |
+--------+--------+
| May    |      5 |
| Olivia |      5 |
+--------+--------+

这也是一个很好的开始。

不要将数字列表存储为逗号分隔的字符串。那样存储数据是错误的。修复你的数据库。是的,有。要获得更详细的答案,您需要编辑您的问题,并提供姓名和号码之间的关系以及哪些人喜欢哪些号码。这是数据库:姓名:号码最大值:3,7,9 John:1,3,4 May:8,5,3 Olivia:5,7,1我需要知道的是,您如何找到记录之间的通用编号?如果我之前没有说清楚,我很抱歉。