regex SELECT FROM表WHERE字符串中有不完整的确切数字SQL

3hvapo4f  于 2022-11-26  发布在  其他
关注(0)|答案(5)|浏览(107)

我有一个表,其中包含一组由逗号分隔的数字。
我想从表中检索字符串中包含确切数字而不是部分数字的行。
示例:

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。
我在这里设置了一个SQL小提琴
我需要做一个正则表达式吗?

gupuwyp2

gupuwyp21#

您只需要一个条件:

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

vktxenjb2#

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

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

查询如下所示:

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

dbf7pr2w3#

你可以用手术室把他们都抓起来

SELECT ...

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

kd3sttzy4#

您没有指定您使用的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
mwkjh3gx

mwkjh3gx5#

您的SQL Fiddle使用的是MySQL,并且您的语法与MySQL一致。有一个内置函数可供用途:

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

话虽如此,修复你的数据模型,这样你就不是在一个单一的列中存储列表了。抱歉,说得这么大声,这只是数据库设计的一个重要原则。
您应该有一个名为teamUsers的数据表,其中每个小组和该小组中的每个使用者各有一个数据列。您储存数据的方法不佳的原因有很多:

  • 数字应存储为数字,而不是字符串。
  • 列应包含单个值。
  • 应正确声明外键关系。
  • SQL(一般而言)的字符串处理函数很糟糕。
  • 无法优化生成的查询。
  • 简单的事情,如按顺序列出uid或删除重复的是不必要的困难。

相关问题