Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle sql如何匹配通过3列拆分的名称?_Sql_Oracle - Fatal编程技术网

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

oracle sql如何匹配通过3列拆分的名称?,sql,oracle,Sql,Oracle,这个数据库不是我的,所以我不能将它更改为一个名称列(很遗憾) 我通过ajax将查询字符串$qs发送到一个php文件 file.php?qs=john%rambo 我希望它查询oracle数据库并返回名称“John MEga Rambo”,因此我认为这会起作用,但事实并非如此: SQL: SELECT CONCAT(CONCAT(name1,name2),name3) as name FROM table1 WHERE name LIKE '%{$qs}%' SELECT CONCAT

这个数据库不是我的,所以我不能将它更改为一个名称列(很遗憾)

我通过ajax将查询字符串$qs发送到一个php文件 file.php?qs=john%rambo

我希望它查询oracle数据库并返回名称“John MEga Rambo”,因此我认为这会起作用,但事实并非如此:

SQL:

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

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

可能您遇到了一个无效的标识符错误。由于分析和执行查询的顺序,您不能在定义的查询级别中引用列别名(在
order by
中除外)

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

使用一些虚拟数据:

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
不会找到匹配项。如果这对你来说是个问题,有几种方法可以解决。

谢谢Alex Poole的回复,这些都没有完全解决问题,但它为我指明了正确的方向!oracle似乎对语法有点挑剔,所以在MySQL中使用的简单的have在oracle上不起作用。我将发布针对ORACLE和MySQL的两种解决方案

MySQL:

SELECT CONCAT(CONCAT(name1,name2),name3) as name 
  FROM table1 
 WHERE name LIKE '%{$qs}%'
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}%' 

比“不起作用”更具体一些总是有帮助的。描述一段代码是如何工作的,它抛出了什么错误,等等都非常有用。您发布的代码可能会有语法错误,但如果没有错误消息来确认这一点,很难知道您是否犯了转录错误。“它不起作用”通常不是很有帮助,请提供实际错误或不正确的行为。您的表没有
名称
列;您似乎想搜索三列中任何一列的现有值,但不确定最后几段的意思,因为这意味着列的组合?你们说得对,我下次发布问题时会考虑到这一点,谢谢!为了记录,我得到了oracle错误904无效标识符,这很有意义,因为该标识符不是查询表中的选定列。使用HAVING子句会导致相同的错误如果您的CTE工作,那么我显示的内联视图/子查询也会工作-如果您只引用一次,它们本质上是相同的。请随意评论我的回答,并说明为什么它对您不起作用。但是你的问题没有提到MySQL或
拥有
?我会在以后有机会的时候发布错误消息,我只提到MySQL是因为它是我通常使用的,发布这两个答案只是因为为什么不:)