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

时间:2017-10-01 12:01:02

标签: sql

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

Names: Max¦ John¦ May¦ Olivia

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

有没有办法使用SQL检查“数字”列,看看有多少人喜欢数字5,然后向用户显示他们的姓名,谁更喜欢这个数字。

2 个答案:

答案 0 :(得分:1)

好吧,首先你有一个糟糕的数据库设计,但如果你还想继续前进,那么这里是怎么做的:

SELECT *
FROM YourTableName
WHERE Numbers LIKE '%5%';

结果:

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

但我建议将设计更改为:

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  | Number |
+--------+--------+
| May    |      5 |
| Olivia |      5 |
+--------+--------+

<强> Demo1

<强> Demo2

这也是一个很好的 article

答案 1 :(得分:0)

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

  • SQL具有用于存储列表的出色数据结构。它被称为,而不是字符串。
  • SQL具有(相对)糟糕的字符串处理功能。
  • 对字符串使用过滤器的查询通常无法使用索引。
  • 数字应存储在适当的数据类型中 - 这是一个数字,而不是字符串。
  • 如果数字是另一个表中的id,则无法声明外键关系。

如果你想找到&#34; 5&#34;在字符串中,您可以使用like

where numbers like '%5%'

这可能不会做你想要的,因为它会匹配&#34; 5&#34;到&#34; 15&#34;。虽然这可以修复,但请回过头来理解为什么不应该以这种方式存储数据。相反,你想要一个像这样的表:

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