以下引用自SQL使用帮助:
CHARINDEX
返回字符串中指定表达式的起始位置。
语法
CHARINDEX ( expression1 , expression2 [ , start_location ] )
参数
expression1
一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。
expression2
一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。
start_location
在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。
PATINDEX
返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
语法
PATINDEX ( '%pattern%' , expression )
参数
pattern
一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式。
expression
一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。
比较
CHARINDEX 和 PATINDEX
CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置。PATINDEX 可使用通配符,而 CHARINDEX 不可以。
这两个函数都带有两个参数:
希望获取其位置的模式。使用 PATINDEX,模式是可以包含通配符的字面字符串。使用 CHARINDEX,模式是字面字符串(不能包含通配符)。
字符串值表达式(通常为列名),Microsoft® SQL Server™ 在其中搜索指定的模式。
例如,查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。
USE pubs
SELECT CHARINDEX('wonderful', notes)
FROM titles
WHERE title_id = 'TC3218'
下面是结果集:
----------------
46
(1 row(s) affected)
如果未限制搜索的行,查询将返回表中的所有行,并对在其中查找到该模式的所有行报告非零值,对其它行报告零值。
例如,使用通配符查找模式"candies"在 Categories 表中的 Description 列的任一行中的开始位置:
USE Northwind
GO
SELECT CategoryID, PATINDEX('%candies%', Description)AS POSITION
FROM Categories
WHERE PATINDEX('%candies%', Description) <>0
如果没有限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值。
PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。
其实你这个需要程序和数据库有一致的设计。可考虑分区。通过电话前缀来分区,以下只是一个形式,不推荐用中文命名,
这样,只要用户不填写电话,那么前三字符就是xxx,自动会放入 ZFU区。
CREATE TABLE Customer
(
ID INT NOT NULL,
Mobile_PerNO CHAR(3) DEFAULT 'xxx',
Mobile VARCHAR(30)
)
PARTITION BY LIST(Mobile_PerNO)
PARTITION 联通186 VALUES IN (133),
PARTITION 移动139 VALUES IN (139),
PARTITION 电信133 VALUES IN (133),
PARTITION ZFU VALUES IN (xxx)
)
其次你过于依赖数据库而成形的程序,用点不客气的话说,那就是耦合极高的设计。
你其实完全可以在注册时,写入验证,一个手机号就能注册一次。左右打掉空格,这样手机上就能建立唯一索引。 使用LIKE ‘133%’ 至少性能上有一定的飞跃。
至于你的第二个SQL, 在时间和发送号码上可以建立索引,然后条件上写入时间。
也可以使用hash方式按照年季度分区。
理论上 性能提升百倍还是一点问题都没有的。
分区资料 看官方文档。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)