我有一个包含菜单和项目的数据库,两者之间存在关系,因此项目可以放在菜单上。
我想要一个可以从用户那里获得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
答案 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
我希望我现在唯一能做的就是弄清楚如何强制输入的值为小写,以及强制输入的值以大写字母开头,这样我就可以获得更多的结果。但总的来说似乎仍然很好用!