MYSQL在Trim上选择

时间:2010-10-27 02:28:41

标签: sql mysql

非常简单,我想选择以字母“A”开头的所有标题,而忽略字符串开头的短划线。

SELECT * TRIM(LEADING '- ' FROM title) WHERE title LIKE 'A%'

这似乎不起作用。请帮忙。感谢。

3 个答案:

答案 0 :(得分:3)

如果你想要合适的速度,你应该尽可能地避免每行功能。通常,我建议使用插入/更新触发器来存储修改后的数据,以便在所有选择中分摊计算成本(请参阅here以获取解释以及我遵循的其他一些指导原则)但是,对于此特定情况例如,有一种更简单的方法 * a

只需使用:

select * from table where title like 'A%' or title like '- A%'

如果您的DBMS的执行引擎有任何好处,它会将其转换为两个非常快(假设标题被索引)的数据传递,而不必处理表中的每一行。

如果您的执行引擎那么聪明,请尝试:

select * from table where title like 'A%'
union all select * from table where title like '- A%'

看看是否有帮助。请务必使用union all,而不仅仅是union。后者将尝试删除重复项,在这种情况下不必要,因为标题不能以"A" "- A"开头。

并且,与所有优化一样,测量,不要猜测!


* a 如果您希望进行不区分大小写的搜索,可能仍需要考虑使用trigger / extra-column方法。这个答案中的方法对于第一个字母(a%/A%/-a%/-A%)的不区分大小写可以正常工作,但是如果你正在寻找像Bill这样需要32个单独条款的项目,那么它会很快降低( 2个带有和不带连字符前缀的 4 字符组合。

答案 1 :(得分:1)

SELECT TRIM(LEADING '- ' FROM title) FROM [missing table here] WHERE TRIM(LEADING '- ' FROM title) LIKE 'A%'

答案 2 :(得分:0)

SELECT * TRIM(LEADING '- ' FROM title) WHERE title LIKE 'A%'

你的where子句永远不会工作,因为你试图与POST修剪数据进行比较,但是数据库正在进行TRIM之前的比较。

有两种选择:

SELECT *
FROM table
WHERE title LIKE '- A%'

SELECT *, TRIM(LEADING '- ' FROM title) AS title
FROM table
WHERE title LIKE 'A%'

在这两者中,第一个是优选的,因为它允许使用索引。第二个,因为你要与动态导出的数据进行比较,所以不会。