选择first_name,其中last_name具有第二个字母' o'?

时间:2014-10-12 14:32:29

标签: sql oracle

我正在使用Oracle,这些信息来自“HR.EMPLOYEES”表,但我不知道如何构建该查询。

1 个答案:

答案 0 :(得分:5)

有几种方法可以实现您的目标。没有特别的顺序:

使用SUBSTR

只需使用SUBSTR即可。此功能允许您从字符串中提取部件:

SELECT first_name FROM table WHERE SUBSTR(last_name, 2, 1) = 'o'

请记住,您只是将基于小写的行过滤为“o”,这与大写的“O”不同。而且,您还需要在列上创建function-based index,以避免由performance issues引起的任何FTS

如果您只有一列名称,请使用SUBSTR中的INSTRSELECT获取first_name。我想把这个留给你。如果你真的与INSTR斗争,请告诉我。提示您尝试自学,INSTR( string, substring [, start_position [, nth_appearance ] ] )

使用正则表达式

使用REGEXP_LIKE可以实现同样的目的,但是,这将耗费大量资源:

SELECT first_name FROM table WHERE REGEXP_LIKE(last_name, '^.o')

在这里,我正在寻找一个字符串,如:

    字符串开始后
  • ^
  • .我有任何字符
  • o然后是 o

使用LIKE模式匹配

此解决方案与数据库供应商无关:它将与(几乎?)任何RDBMS一起使用:

SELECT first_name FROM table WHERE last_name LIKE '_o%'

模式匹配或多或少类似于您可能在shell中使用的通配符。除了SQL _用于任何字符%用于任何字符串(包括空字符串)。

其他

通过搜索网络和各种Oracle文档,您可能会找到其他几种 - 或多或少的异国情调 - 选项。

例如,有人可能会想到在last_name的第二个字母上使用虚拟列

或者, 当且仅当 时,您需要不区分大小写的方法,您可以查看此演示http://lalitkumarb.wordpress.com/2014/01/22/oracle-case-insensitive-sorts-compares/。在开始复杂的事情之前,请确保你对上面提到的琐碎方面有最大的了解。