oracle sql如何匹配通过3列拆分的名称?
这个数据库不是我的,所以我不能将它更改为一个名称列(很遗憾) 我通过ajax将查询字符串$qs发送到一个php文件 file.php?qs=john%rambo 我希望它查询oracle数据库并返回名称“John MEga Rambo”,因此我认为这会起作用,但事实并非如此: SQL: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
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是因为它是我通常使用的,发布这两个答案只是因为为什么不:)