SQL 包含 ID 列表的服务器查询列

SQL Server query column containing list of id's

我可能把这个复杂化了,但我正在尝试做一个查询,returns 记录列表(ridlist)中的一个或多个 id 出现在也是列表的列中id 的(rids)。

可能有一种更简单的方法可以做到这一点,但我是新手,无法理解它。

伪查询:

select boid, rids, address, city, state, zip
from branchoffices
where rids contains one or more of the ids in ridlist

我有负责不同区域的分支机构,我需要能够列出处理用户选择的区域列表中的活动的所有分支机构。

例如:

branchoffice1's rid field in the db contains 1,13,22
branchoffice2's rid field contains 2,3,4

如果用户选择区域 1 和 2,则创建列表 2,3。我只想查询 return branchoffice2 的 boid。所以我不认为使用 like % 会起作用。

表:

示例数据:

区域table(删除,区域名称):

"1", "Dallas/Fort Worth"
"2", "Greater Houston"
"3", "Austin"
"4", "San Antonio"
"5", "San Marcos"
etc

分支机构 table(boid、rids、城市、州、phone):

"1", "2,3", "Houston", "TX", "1231231234"
"2", "1", "Fort Worth", "TX", "4561231234"
"3", "4,5", "San Antonio", "TX", "7891231234"

因此在上面的示例数据中,boid 1(休斯顿办公室)负责大休斯顿和奥斯汀地区。

希望这是有道理的。

非常感谢您提供的任何帮助,如果我错过了已经涵盖的内容,我深表歉意。

您应该有一个单独的 table,每个分支和每个 rid 一行。为什么将 id 存储在字符串中是错误的?以下是一些原因:

  • rid是一个整数。它应该存储为整数,而不是字符串。
  • 一列(至少使用基本列类型)应该只存储一个值。
  • 应该正确声明外键,当值的类型错误时不能这样做。
  • SQL 服务器有糟糕的字符串函数(承认吧)。
  • SQL 服务器不能很好地优化查询。
  • SQL 有这种存储列表的好方法。它被称为 table,而不是 string.

有时,您会被其他人非常、非常、非常糟糕的设计所困。 SQL服务器有个功能可以帮到你,split_string()。您可以将它与横向连接一起使用:

select bo.*
from branchoffices bo cross apply
     (select ss.rid
      from split_string(bo.rids) ss(rid)
      where ss.rid in (1, 2, 3)
     ) ss;

请注意,您还可以在使用输入中使用 split_string()

with rids as (
      select rid
      from split_string('1,2,3') ss(rid)
     )
select bo.*
from branchoffices bo cross apply
     (select ss.rid
      from split_string(bo.rids) ss(rid) join
           rids
           on ss.rid = rids.rid
     ) ss;