SQL Server在文本列中搜索确切的短语

时间:2018-08-23 16:02:54

标签: sql sql-server tsql

我正在使用SQL Server,并且试图找出如何在dbo.tickets中的列tags中进行搜索并搜索诸如lwr_tickets之类的短语。

现在,我有一个查询,该查询将按日期获取所有用户的票证并在其中显示名称。我试图弄清楚如何查看在哪个分支的票。

因此,lwr_tickets处的票总数。数据库中的tags字段名有一长串的标签名,每个票证都用逗号分隔。因此,我试图弄清楚如何编写遍历标签列的内容,然后只返回其中包含lwr_tickets的内容,以获取该分支的总数。

任何帮助将不胜感激。

找到所有门票:

select
    u.Id,
    u.Name,
    t.submitter_id,
    COUNT(*) as numberOfTickets
from Users as u 
join Tickets as t on t.submitter_id = u.Id and t.created_at between '2017/11/01' and '2018/08/23'
group by u.Id, u.Name, t.submitter_id 

现在尝试添加将搜索lwr_tickets的位置

尝试:

select
    u.Id,
    u.Name,
    t.submitter_id,
    COUNT(*) as numberOfTickets
from Users as u 
join Tickets as t on t.submitter_id = u.Id and t.created_at between '2017/11/01' and '2018/08/23'
group by u.Id, u.Name, t.submitter_id 
where t.tags = "lwr_tickets"

1 个答案:

答案 0 :(得分:3)

用逗号分隔的列表应存储在字符串中。关系数据库不应该这样工作。原因很多。您的数据应该有一个ticketTags表,每个票证和每个标签一行。

有时候,我们真的非常,非常非常糟糕的设计决策与其他人纠缠在一起。您可以为此使用like

select u.Id, u.Name, t.submitter_id,
       count(*) as numberOfTickets
from Users u join
     Tickets t
     on t.submitter_id = u.Id 
where t.created_at between '2017-11-01' and '2018-08-23' and
      ',' + t.tags + ',' like '%,' + 'lwr_tickets' + ',%'
group by u.Id, u.Name, t.submitter_id;

注意:

  • wherefrom之后并在group by之前。
  • 通常,在SQL中(尤其是在SQL Server中),字符串用单引号引起来。
  • 连字符是日期的(ISO)标准,这就是为什么我使用它。
  • 您几乎无法提高性能。