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
的表,每个团队和该团队中的每个用户都有一行。您存储数据的方法不好的原因有很多:
uid
s 或删除重复项是不必要的困难。
【讨论】:
以上是关于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