非常简单,我想选择以字母“A”开头的所有标题,而忽略字符串开头的短划线。
SELECT * TRIM(LEADING '- ' FROM title) WHERE title LIKE 'A%'
这似乎不起作用。请帮忙。感谢。
答案 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%'
在这两者中,第一个是优选的,因为它允许使用索引。第二个,因为你要与动态导出的数据进行比较,所以不会。