基于数组字段中的整数选择记录

neo*_*key 0 sql t-sql sql-server sql-server-2005

我有一个房子数据库.在房屋内,mssql数据库记录是一个名为areaID的字段.房子可以在多个区域,因此数据库中的条目可以如下:

+---------+----------------------+-----------+-------------+-------+
| HouseID | AreaID               | HouseType | Description | Title |
+---------+----------------------+-----------+-------------+-------+
| 21      | 17, 32, 53           | B         | data        | data  |
+---------+----------------------+-----------+-------------+-------+
| 23      | 23, 73               | B         | data        | data  |
+---------+----------------------+-----------+-------------+-------+
| 24      | 53, 12, 153, 72, 153 | B         | data        | data  |
+---------+----------------------+-----------+-------------+-------+
| 23      | 23, 53               | B         | data        | data  |
+---------+----------------------+-----------+-------------+-------+
Run Code Online (Sandbox Code Playgroud)

如果我打开一个仅在区域53中呼叫房屋的页面,我将如何搜索它.我知道在MySQL中你可以使用find_in_SET但我使用的是Microsoft SQL Server 2005.

Ric*_*iwi 5

如果你的格式是完全正确的

N1, N2 (e.g.) one comma and space between each N
Run Code Online (Sandbox Code Playgroud)

然后使用此WHERE子句

WHERE ', ' + AreaID + ',' LIKE '%, 53,%'
Run Code Online (Sandbox Code Playgroud)

添加前缀和后缀使得列表中任何位置的每个数字始终用逗号空格包装并以逗号为后缀.否则,你可能会得到误报,53出现在另一个数字的一​​部分.

注意

  1. 一个LIKE表达式是什么,但速度快,因为它总是会扫描整个表.
  2. 您应该考虑将数据规范化为两个表:

表变成了

House
+---------+----------------------+----------+
| HouseID | HouseType | Description | Title |
+---------+----------------------+----------+
| 21      | B         | data        | data  |
| 23      | B         | data        | data  |
| 24      | B         | data        | data  |
| 23      | B         | data        | data  |
+---------+----------------------+----------+

HouseArea
+---------+-------
| HouseID | AreaID
+---------+-------
| 21      | 17
| 21      | 32
| 21      | 53
| 23      | 23
| 23      | 73
..etc
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

select * from house h
where exists (
    select *
    from housearea a
    where h.houseid=a.houseid and a.areaid=53)
Run Code Online (Sandbox Code Playgroud)