我可能把这个问题复杂化了,但我正在尝试执行一个查询,该查询返回记录,其中列表(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。我希望查询仅返回branchoffice2 的boid。所以我认为使用像 % 这样的方法是行不通的。
表格:
regions
- rod(ident)、regionname、其他一些列分支机构
- boid(ident)、rids、城市、州、邮政编码以及其他一些列
示例数据:
区域表(rid,区域名称):
"1", "Dallas/Fort Worth"
"2", "Greater Houston"
"3", "Austin"
"4", "San Antonio"
"5", "San Marcos"
etc
分支机构表(boid、rids、城市、州、电话):
"1", "2,3", "Houston", "TX", "1231231234"
"2", "1", "Fort Worth", "TX", "4561231234"
"3", "4,5", "San Antonio", "TX", "7891231234"
因此,在上面的示例数据中,boid 1(休斯顿办事处)负责大休斯顿和奥斯汀地区。
希望这是有道理的。
非常感谢您的帮助,如果我错过了这个内容,我深表歉意。
最佳答案
您应该有一个单独的表,每个分支和每个 Rid 一行。为什么将 id 存储在字符串中是错误的?以下是一些原因:
rid
是一个整数。它应该存储为整数,而不是字符串。- 一列(至少使用基本列类型)应仅存储一个值。
- 应正确声明外键,当值的类型错误时不能这样做。
- SQL Server 的字符串函数很糟糕(承认吧)。
- SQL Server 无法很好地优化查询。
- SQL 有这种存储列表的好方法。它被称为表,而不是字符串。
有时,您会被其他人非常非常糟糕的设计所困扰。 SQL Server 有一个函数可以帮助您,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;
请注意,您还可以在 use 输入上使用 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;
关于SQL Server 查询列包含 id 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50266193/