以下引用自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 子句中。
1.不用like,不知你那是一个什么列,如果是不太长的字符串列,可以考虑建立一个手工的哈希索引,就是把那个原本要搜索的列转换为crc32()后的一串数字,然后再搜索的时候用 = crc32('keyword'), 这个是优化的一种方法,效率比like好很多如果只是字符左端或者右端是要查找的重点 可以用left()或者right() 截取一部分来查找 还是用 =
如果是text的列,那只能用全文索引了
2.字符拼接?你是不是用了CONCAT('xx','xx')这个函数?这个就是把字符串拼起来的函数
运算应该就是简单的加减乘除运算吧,或者有NOW()之类的函数,在简单的sql查询里也不可能进行太复杂的运算 *** 作。他提这点,应该是你的语句使mysql不能使用查询缓存,导致效率低
新浪的意思大概就是你的sql效率太低,需要优化,你可以看看sql语句,有哪些优化的地方,优化优化就好了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)