【问题标题】:SQL Server 2008 how to query comma separated string from one column?SQL Server 2008 如何从一列中查询逗号分隔的字符串?
【发布时间】:2017-10-14 02:34:44
【问题描述】:

POST

postId  Tag    Author
-----------------------
1       A,B    x,y
2       B,C,D  x
3       C,D    y

问题:

  1. 如何选择逗号分隔字符串中 Tag='B' 的记录?从上面的例子中它应该返回记录 1,2。

  2. 如何选择 Tag='B' 和 Author='y' 的记录?返回的记录应该是1。

顺便说一句:如果我将数据库方案重新设计为三个表POSTTAGAUTHOR,然后通过内连接子句查询所需的记录。与前一种方法相比,哪种方法性能更好?表POST一共有1万条记录。

【问题讨论】:

  • 如果您想在列表中搜索列表,则不能在字符串级别执行此操作!如果您想在A,B,C,D 中找到A,这很容易,与B,C 相同。但是C,BA,C 呢?这些值必须存储在单独的表中。在您的情况下,我建议使用经典的m:n 设计,其中包含用于帖子、标签和作者的表以及它们之间的映射表。顺便说一句:10.000 条记录并不多......

标签: sql sql-server json xml


【解决方案1】:

显然,您知道将列表存储为分隔字符串是在 SQL 中存储值的错误方法。有时,我们会被其他人非常糟糕的设计所困扰,但第一步确实应该是修复数据模型。

做你想做的,你可以做:

select *
from t
where ',' + tag + ',' like '%,B,%'

第二个问题类似:

where ',' + tag + ',' like '%,B,%' and
      ',' + author + ',' like '%,y,%'

【讨论】:

  • 谢谢。过滤器值可能是“B,C”,而不是生产中的一个“B”。因此,将这些记录以 JSON 格式存储在 NoSQL 数据库中会是更好的选择,例如LiteDB ?
  • 在 SQL 中存储列表的正确方法是作为一个表,每个列表值一行。
【解决方案2】:

使用charindex怎么样?

select * from table1 where charindex('B', tag) <> 0;

select * from table1 where charindex('B', tag) <> 0 and charindex('y', author) <> 0;

Fiddle.

【讨论】:

  • 感谢您的在线演示。过滤器值可能是“B,C”而不是生产中的一个“B”。
  • 如果您将'B' 替换为'B,C',它应该仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多