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

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