Oracle的SQL - 如何获取用户输入并在查询中搜索它

时间:2015-12-10 21:17:41

标签: sql oracle sqlplus where-clause

我有一个包含菜单和项目的数据库,两者之间存在关系,因此项目可以放在菜单上。

我想要一个可以从用户那里获得varchar2输入的select语句,然后检查输入的值是否是菜单上任何项目名称的一部分。

例如,如果用户要输入草莓'我希望查询输出所有带有相应项目的菜单,这些项目包含' strawberry'在他们中。像...

Menu                     Item
--------------------     -----------------------------
Valentine Theme          Chocolate covered strawberry       
Red Drink Theme          Strawberry Margarita
Red Drink Theme          Strawberry sensation

[怎么]这可能吗?这是我迄今为止尝试过的,但都失败了......

尝试1

select menu_name Menu, item_name Item
from menu m, item_for_menu i_m, item i
where m.menu_id=i_m.menu_id
    and i.item_id=i_m.item_id
    (and item_name = '&name_of_item'
    or item_name like '%name_of_item%');

尝试2 (经过一些谷歌搜索):

accept item_in prompt 'What item do you want to search for? '

select menu_name Menu, item_name Item
from menu m, item_for_menu i_m, item i
where m.menu_id=i_m.menu_id
    and i.item_id=i_m.item_id
    and item_name like item_in;

undefine item_in

3 个答案:

答案 0 :(得分:0)

您是否已尝试通过SQL执行所有这些操作,或者您是否对其他选项开放?

例如,您可以使用Oracle的Java库JDBC(https://docs.oracle.com/javase/tutorial/jdbc/overview/index.html)在Java中构建接口并以这种方式连接到您的数据库。它可以让您更好地控制数据的表示,通过创建另一层编程结构,可以将用户与直接访问数据库分开。

答案 1 :(得分:0)

确实有比SQL提示更好的方法来获取用户的输入,但您的查询仍然存在缺陷。你要么不考虑这个案子,要么忘记添加通配符。也许还有其他问题,但你没有说明查询失败的确切方式,所以我不得不假设。

试试这个,修改后的第二个查询:

accept item_in prompt 'What item do you want to search for? '

select menu_name Menu, item_name Item
from menu m, item_for_menu i_m, item i
where m.menu_id=i_m.menu_id
    and i.item_id=i_m.item_id
    and upper(item_name) like upper('%'||item_in||'%');

undefine item_in

如果仍然失败,请调试。尝试在没有item_in的情况下执行查询,直接将字符串放在那里,直到获得所需的数据,然后用替换变量替换字符串。

答案 2 :(得分:0)

感谢你的建议! 这是我最终的工作解决方案:

set verify off

select 'The ' || menu_name || ' Menu contains ' || item_name Results
from menu m, item_for_menu i_m, item i
where m.menu_id=i_m.menu_id
    and i.item_id=i_m.item_id
    and item_name like '%'||'&search_for_item'||'%'
order by menu_name,item_name;

set verify on

我希望我现在唯一能做的就是弄清楚如何强制输入的值为小写,以及强制输入的值以大写字母开头,这样我就可以获得更多的结果。但总的来说似乎仍然很好用!