SqlServer 模糊查询—原创
在今天在查询一个字段时遇到一个问题,需要在一段地址中筛选出天津、北京的地址段。
以下是我写的SQL语句:
SELECT Address FROM UserAddress WHERE Address LIKE '%北京%' OR Address LIKE '%天津%'
总感觉想要去优化一下,因为如果再增加条件感觉同样的格式在后面追加有些冗余。
假设数据表结构和数据如下,我们称为UserAddress表
Id | Name | Phone | Address |
---|---|---|---|
1 | 张三 | 19946195265 | 北京同仁堂 |
2 | 李四 | 19946192212 | 天津同仁堂 |
3 | 王五 | 19946193312 | 上海沪北路 |
4 | 赵六 | 19946195123 | 中国北京同仁堂 |
5 | 田七 | 19946195231 | 北京1 |
首先我们了解一下模糊查询和通配符。
% 匹配一个或多个字符
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '%北京%'
通过上面的SQL可以查询出张三、赵六、田七的电话和地址,如果我们改一下
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '北京%'
此时只能出现张三、田七的电话和地址,因为赵六的地址前有一定的字符
_ 匹配一个字符
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '北京_'
通过上面的SQL只可以查询出田七的电话和地址
[] 匹配中括号中的任意一个字符
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '%[天同]%'
通过上面的SQL只可以查询出张三、李四、赵六的电话和地址
灵活使用
之前在使用的时候遇到这样一个问题,比如用户给的地址为中国北京同仁堂XX路XX街道,我想得到所有含有北京同仁堂的信息,此时我们可以反写LIKE
,利用CONCAT
SELECT Name,Phone,Address FROM UserAddress WHERE '中国北京同仁堂XX路XX街道' LIKE CONCAT('%',Address,'%')'
这样我就可以得到张三和赵六的地址了。在使用MyBaits的人应当知道,如果我们做模糊查询XML配置时,要么我们使用Address LIKE '${address}'
,但是这样可能会造成SQL注入,因此我们通畅使用Address LIKE CONCAT('%',#{address},'%')
,利用这点可以反查列,如果有需求可以使用。
在搜集资料的时候有人给了我一个思路,代码如下:
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '%[北京天津]%'
事实上,如此写的话会将所有含有北、京、天、津的信息都查出来,得到的结果是5天数据都返回出来了,因此不可用。但是提供给我一个思路
SELECT Name,Phone,Address FROM UserAddress WHERE Address LIKE '%[北天][京津]%'
如此一来就可以得到我们想要的结果,但是还有可能会出现问题,比如真的存在北津、天京这样的地址,所以如果在不能确保地址不包含这些组合的情况下,还是使用最原始的查询方法比较好,当然我所指的是SQL Server,对于其他的数据库可能有更好的解决方案。如果针对SQL Server有更好的解决方案请告知我,谢谢。
本文原创自小阳光而已转载请标明出处