SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中

Posted

技术标签:

【中文标题】SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中【英文标题】:SELECT FROM Table WHERE exact number not partial is in a string SQL 【发布时间】:2019-06-16 07:59:29 【问题描述】:

我有一个表格,其中包含一堆用逗号分隔的数字。

我想从表中检索字符串中包含确切数字而非部分数字的行。

示例:

CREATE TABLE IF NOT EXISTS `teams` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `uids` text NOT NULL,
  `islive` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

INSERT INTO `teams` (`id`, `name`, `uids`, `islive`) VALUES
(1, 'Test Team', '1,2,8', 1),
(3, 'Test Team 2', '14,18,19', 1),
(4, 'Another Team', '1,8,20,23', 1);

我想搜索字符串中 1 的位置。

目前,如果我使用 Contains 或 LIKE,它会带回所有带 1 的行,但 18、19 等不是 1,但其中确实有 1。

I have setup a sqlfiddle here

我需要做一个正则表达式吗?

【问题讨论】:

这就是为什么你不在 SQL 表中存储这样的数据。 现在把这个表格结构放在谷仓后面并拍摄它是不是太晚了,因为这是你应该做的......重新开始并正确构建这些数据,它将为你节省大量时间和在路上受苦。 可能最好的方法是使用字符串拆分函数并与结果进行比较 【参考方案1】:

你只需要1个条件:

select *
from teams
where concat(',', uids, ',') like '%,1,%'

【讨论】:

@TheImpaler -- 确实如此,他在开头和结尾添加了逗号。 只希望逗号之间没有空格。【参考方案2】:

我会搜索您正在搜索的 ID 的所有四个可能位置:

作为列表的唯一元素。 作为列表的第一个元素。 作为列表的最后一个元素。 作为列表的内部元素。

查询看起来像:

select *
from teams
where uids = '1' -- only
   or uids like '1,%' -- first
   or uids like '%,1' -- last
   or uids like '%,1,%' -- inner

【讨论】:

uids = '1' -- only 已更改。尽管LIKE 有效,= 更直观。 是的,如果它不需要使用模式匹配,它可能会稍微快一点。【参考方案3】:

你可能会用 OR 抓住它们

SELECT ...

WHERE uids LIKE '1,%'
OR  uids LIKE '%,1'
OR uids LIKE '%, 1'
OR uids LIKE '%,1,%'
OR uids = '1'

【讨论】:

@Hogan 对于人们存储未标准化的数据,我从不肯定。【参考方案4】:

您没有指定您使用的是哪个版本的 SQL Server,但如果您使用的是 2016+,则可以访问在这种情况下可以使用的 STRING_SPLIT 函数。这是一个例子:

CREATE TABLE #T
     (
        id int,
        string varchar(20)
     )

     INSERT INTO #T
     SELECT 1, '1,2,8' UNION
     SELECT 2, '14,18,19' UNION
     SELECT 3, '1,8,20,23' 


     SELECT * FROM #T
     CROSS APPLY string_split(string, ',')
     WHERE value = 1

【讨论】:

【参考方案5】:

您的 SQL Fiddle 正在使用 mysql,并且您的语法与 MySQL 一致。有一个内置函数可以使用:

select t.*
from teams t
where find_in_set(1, uids) > 0;

话虽如此,请修复您的数据模型,这样您就不会将列表存储在单列中。不好意思说得这么大声,这只是数据库设计的一个重要原则。

您应该有一个名为 teamUsers 的表,每个团队和该团队中的每个用户都有一行。您存储数据的方法不好的原因有很多:

数字应存储为数字,而不是字符串。 列应包含单个值。 应正确声明外键关系。 SQL(通常)具有糟糕的字符串处理功能。 无法优化生成的查询。 简单的事情,例如按顺序列出 uids 或删除重复项是不必要的困难。

【讨论】:

以上是关于SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中的主要内容,如果未能解决你的问题,请参考以下文章

SELECT FROM Table WHERE 不部分的确切数字在字符串 SQL 中

Mysql DB select from table where field语句java

SQL 语句 select sum(a) from table1 where b=3

哪个更快,select * from table where id=a

MYSQL中 select * from table1 t1, table2 t2 where t1.name= t2.name

Select into Table from Table2 where column in (Subquery)