Oracle 的 SQL - 如何获取用户输入并在查询中搜索它
Oracle's SQL - How to get user input and search it in a query
我有一个包含菜单和项目的数据库,两者之间存在关系,因此项目可以放在菜单上。
我想要一个 select 语句,它可以从用户那里获取 varchar2 输入,然后检查输入的值是否是菜单上任何项目名称的一部分。
例如,如果用户要输入 'strawberry',我希望查询输出所有菜单,其中相应的项目中包含单词 '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
您是否打算通过 SQL 尝试完成所有这一切,或者您是否愿意接受其他选择?
例如,您可以使用 Oracle 的 Java 库 JDBC (https://docs.oracle.com/javase/tutorial/jdbc/overview/index.html) 在 Java 中构建一个接口并以此方式连接到您的数据库。它可以让您更好地控制数据的呈现,并且通过创建另一层编程结构将用户与直接访问您的数据库分开可能是有益的。
确实有比 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
的情况下执行查询,将字符串直接放在那里,直到获得所需的数据,然后用替换变量替换字符串。
谢谢大家的指教!
这是我最终得到的有效解决方案:
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
我现在唯一希望我能做的就是弄清楚如何将输入的值强制为小写,以及强制输入的值以大写字母开头,以便我可以获得更多结果。不过总的来说似乎仍然很好用!
我有一个包含菜单和项目的数据库,两者之间存在关系,因此项目可以放在菜单上。
我想要一个 select 语句,它可以从用户那里获取 varchar2 输入,然后检查输入的值是否是菜单上任何项目名称的一部分。
例如,如果用户要输入 'strawberry',我希望查询输出所有菜单,其中相应的项目中包含单词 '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
您是否打算通过 SQL 尝试完成所有这一切,或者您是否愿意接受其他选择?
例如,您可以使用 Oracle 的 Java 库 JDBC (https://docs.oracle.com/javase/tutorial/jdbc/overview/index.html) 在 Java 中构建一个接口并以此方式连接到您的数据库。它可以让您更好地控制数据的呈现,并且通过创建另一层编程结构将用户与直接访问您的数据库分开可能是有益的。
确实有比 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
的情况下执行查询,将字符串直接放在那里,直到获得所需的数据,然后用替换变量替换字符串。
谢谢大家的指教! 这是我最终得到的有效解决方案:
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
我现在唯一希望我能做的就是弄清楚如何将输入的值强制为小写,以及强制输入的值以大写字母开头,以便我可以获得更多结果。不过总的来说似乎仍然很好用!