【问题标题】:MySQL SELECT with varying WHERE fields具有不同 WHERE 字段的 MySQL SELECT
【发布时间】:2016-12-06 14:39:16
【问题描述】:

在高层次上,这听起来微不足道,但事实证明我已经摸不着头脑了几个小时。

情况:

我有表T,列a,b,c,d,e。列a 保存一个字符串,而b,c,d,e 各保存一个布尔值。

我允许用户执行一种搜索,我提示用户输入a,b,c,d,e 的值,并返回所有这些值都匹配的行。

在一个完美的世界中,用户输入所有值(比如说a="JavaScript"b="true"c="false"d="false"e="true")和结果查询(在 Scala 中) ,引用运行 MySQL 的远程数据库)可能看起来像这样:

connection.createStatement().executeQuery("SELECT * FROM T 
WHERE a = '" + a_input + "' 
and b = " + b_input + "
and c = " + c_input + "
and d = " + d_input + "
and e = " + e_input + ";")

问题:

我为用户提供“放松”约束的选项,因此 a_input=""b_input="" 等可能...所有字段 a,b,c,d,e 可以为空 ("") 如果省略字段,则不应影响结果响应。换言之,如果未输入c,则结果可能包含cTRUEFALSE

的条目

问题:

我如何编写 ONE 查询,以涵盖所有字段可能为空、部分为空或没有的情况?

【问题讨论】:

  • 像这样:where (b_input = '' or b = b_input) and (...)

标签: mysql where varying


【解决方案1】:

只需动态构建WHERE。如果用户为其提供了值,则仅在 WHERE 中包含 c,而不是始终搜索 c = 'whatever'

【讨论】:

  • 如何在一个查询中执行此操作是一个没有大量 if() 检查是否提供值的问题?
  • 唯一的其他选择是在上面的主要评论部分使用 juergen d 的答案。我不知道胡安想说什么
  • 居尔根的回答和我的一样,唯一不同的是我用的是IN子句但是意思完全一样……
  • @Juan No. Yours 说要提取 a 为空白或其他内容的记录。他说的是a_input 为空白或a = a_input 的拉记录。
  • 这与说将匹配任何值的 IN ('','a_input') 的位置相同.....我认为这只是一个误解,但我们想说同样的话
【解决方案2】:

你可以使用

Select *
from table 
where  a in ('','othervalue','othervalue')
and b in ('','othervalue','morevalues')

等等.....就像对每个字段使用 or 一样,即使它是空的也会匹配

【讨论】:

  • 谢谢。如果 field1 是 "",它会寻找 field1 ="" 的实例,还是会完全忽略 field1?如果是前者,这不是我需要的功能。我更新了 OP 中的问题部分,以进一步详细说明我需要什么。
  • 无论如何它都会匹配,因为您需要为每个字段填写任何这些值,就像使用 OR ..... '' or othervalue' 或 'morevalues',试试吧你会看到它有效
  • 也许我被误解了,但我会尝试这个查询并告诉你它是否有效,谢谢。
  • 诺诺,你说得很清楚。您希望所有可能包含或不包含任何值并且同时与用户填写的值匹配的注册表。 IN 子句用于您有可选字段的情况......
  • 它不工作。如果我提供一个参数,它会像预期的那样工作,但如果它留空,它不会让所有参数都通过。
【解决方案3】:

这很棘手,因为数据库包含布尔值,但参数是字符串。参数是否总是空白。 '对或错'?如果是这样试试

(B_input=''
 Or (b_input=''true' and b)
   Or (b_input='false' and ((not b)))

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多