SqlServer 模糊查询

SqlServer 模糊查询—原创

在今天在查询一个字段时遇到一个问题,需要在一段地址中筛选出天津、北京的地址段。
以下是我写的SQL语句:

SELECT Address FROM UserAddress WHERE Address LIKE '%北京%' OR Address LIKE '%天津%'

总感觉想要去优化一下,因为如果再增加条件感觉同样的格式在后面追加有些冗余。

假设数据表结构和数据如下,我们称为UserAddress表
IdNamePhoneAddress
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有更好的解决方案请告知我,谢谢。

本文原创自小阳光而已转载请标明出处

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值