这个数据库不是我的,所以我不能将它改成单个名称列(不幸的是)。
**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}%'
我想这里最大的问题是有人可以通过name1
或name2
/ name1
或name3
进行搜索。有什么想法吗?
答案 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}%'