oracle sql如何通过3列匹配名称?

时间:2016-10-20 23:08:38

标签: sql oracle

这个数据库不是我的,所以我不能将它改成单个名称列(不幸的是)。

**table1:**

name1,name2,name3
john,mega,rambo
john,master,travolta
john,super,connor

我通过ajax将查询字符串$ qs发送到php文件 file.php?适量=约翰%朗博

我希望它查询oracle数据库并返回名称“John MEga Rambo”,所以我认为这样可行但不会:

SQL:

SELECT CONCAT(CONCAT(name1,name2),name3) as name 
  FROM table1 
 WHERE name LIKE '%{$qs}%'

我想这里最大的问题是有人可以通过name1name2 / name1name3进行搜索。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

据推测,您收到的标识符错误无效。您无法在其定义的查询级别(order by除外)中依赖列别名,因为查询的解析和执行顺序。

您可以使用CTE或内联视图(子查询):

SELECT name
FROM (
  SELECT CONCAT(CONCAT(name1,name2),name3) as name 
  FROM table1 
)
WHERE name LIKE '%{$qs}%'

使用一些虚拟数据:

create table table1 (name1 varchar2(10), name2 varchar2(10), name3 varchar2(10));
insert into table1 (name1, name2, name3) values ('john', 'mega', 'rambo');
insert into table1 (name1, name2, name3) values ('john', 'master', 'travolta');
insert into table1 (name1, name2, name3) values ('john', 'super', 'connor');

该查询 - 将{$qs}替换为rambo - 获取:

NAME                          
------------------------------
johnmegarambo

正如您所看到的,concat不会自动添加空格,因此您可能会更容易找到连接运算符:

SELECT name
FROM (
  SELECT name1 ||' '|| name2 ||' '|| name3 as name 
  FROM table1 
)
WHERE name LIKE '%{$qs}%'

NAME                            
--------------------------------
john mega rambo

但是如果您正在寻找更精确的匹配,您可能需要检查每一列:

SELECT name1 ||' '|| name2 ||' '|| name3 as name 
FROM table1 
WHERE name1 = '{$qs}'
OR name2 = '{$qs}'
OR name3 = '{$qs}'

可能你想要灵活地搜索部分匹配。

作为进一步考虑,默认情况下,您只能搜索与搜索字符串大小写完全匹配的值 - 因此,对于您的数据,搜索RAMBO将找不到匹配项。如果这对你来说是一个问题,有几种方法。

答案 1 :(得分:1)

谢谢Alex Poole的回复,那些并没有解决问题,但它指出了我正确的方向!似乎oracle在语法上有点挑剔,所以在MySQL中工作的简单HAVING不会在oracle上工作。我将发布ORACLE和MySQL的两种解决方案

<强> MySQL的:

SELECT CONCAT(CONCAT(name1,name2),name3) AS name
 FROM table1 
HAVING name LIKE '{%$qs}%'

<强> ORACLE

WITH table1 as ( SELECT CONCAT(CONCAT(name1,name2),name3) as name
 FROM table1)
            select * from table1 where name like '%{$qs}%'