【问题标题】:Oracle's SQL - How to get user input and search it in a queryOracle's SQL - 如何获取用户输入并在查询中搜索
【发布时间】:2015-12-12 12:26:35
【问题描述】:

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

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

例如,如果用户要输入“草莓”,我希望查询输出所有菜单以及其中包含“草莓”一词的相应项目。喜欢...

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

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

试一试

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 sqlplus where-clause


    【解决方案1】:

    确实有比 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】:

      您是打算尝试通过 SQL 完成所有这些工作,还是愿意接受其他选择?

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

      【讨论】:

        【解决方案3】:

        感谢大家的建议! 这是我最终得到的可行解决方案:

        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
        

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

        【讨论】:

        • 你不能使用:UPPER(item_name) like UPPER('%'||'&search_for_item'||'%')
        • 或者,如果您的所有值都以 initcap 格式存储在数据库中,则:item_name like INITCAP('%'||'&search_for_item'||'%')
        • 我在回答中提到了这一点,但您不知何故忽略了它。 and upper(item_name) like upper('%'||item_in||'%'); 将立即为您提供 all 匹配项,因为您将大写搜索字符串与大写输入值进行比较,从而有效地忽略大小写。另外,请接受三个答案中的任何一个,不要让您的问题悬而未决。
        • 抱歉,还是习惯了这个界面。这是一个很棒的完美解决方案,谢谢!
        猜你喜欢
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 2021-07-28
        • 2015-01-28
        相关资源
        最近更新 更多