当前位置: 首页 > 面试题库 >

在不混淆嵌套条件的情况下使用“ ND”表达式构建动态SQL?

丌官嘉良
2023-03-14
问题内容

我对php和编码一般还是比较陌生的。

我有一系列条件需要测试是否已设置。它们是$ option1,$ option2,$ option3

if (isset($option1)){
    if (isset($option2)){
        if (isset($option3)){
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2' AND ThirdOption = '$option3'";
        }
        else {
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2";
        }
    }
    else {
        $query = "SELECT *
                           FROM Group
                           WHERE FirstOption = '$option1' AND ThirdOption = '$option3";
    }
}
else {
    // .. snip, much more duplicated code ..
}

因此,这里的问题是我需要根据条件是否设置来对mysql进行唯一查询。但是它们彼此之间有很多联系,实际上我有7种选择,因此分支绝对庞大!我几乎迷惑了自己之后才三点钟停下来。

必须有一种非常出色的书写方式-有人可以帮助我更好地理解吗?


问题答案:

无需动态SQL构建。只需使用逻辑。

SELECT *
  FROM Group
 WHERE (FirstOption = '$option1' or '$option1' = '') 
   AND (SecondOption = '$option2' or '$option2' = '')
   AND (ThirdOption = '$option3' or '$option3' = '')

理想情况下,您将使用占位符和准备好的语句,但是上面的内容对于指导性目的是最清楚的。

万一有好奇的人-这没有很大的查询开销。任何现代数据库引擎都会将'$option1' = ''表达式优化为一个常数值,仅将其评估为布尔值一次。



 类似资料:
  • 对于评估,我希望使用DexGuard加密APK文件中的所有字符串,但不使用模糊、收缩或优化选项 这是可能的还是我被迫混淆APK来加密它 我使用以下命令行加密所有类: conf.pro如下所示: 我已经使用了工具获取所有类名,然后使用

  • 我使用键值存储作为我的Go语言应用程序的后端,日期作为键(保持条目排序),json文档作为值。json的顶级命名空间()以及和存在于我存储的每个json文档中,但在其他方面存在一些差异(尤其是关于一些嵌套的json数据),所以当keyI从数据库中提取时,我真的不知道我在循环浏览的任何时间提取了什么。这是json数据的示例 当我从数据库中提取数据时,我要做的第一件事是将每个条目解组到<code>ma

  • 所以,我想知道是否可以在C#中做下一件事: 我有一个DB模型--假设它是 : 和 中该类型的DbSet: 我还有一个 问题是--有可能用不同的IN对象动态构建linq WHERE表达式吗? null

  • 3.4.4 使用混淆 自从 Gradle plugin for ProGuard 4.10 版本以后,Gradle 开始支持混淆。如果通过 Build Type 的 minifyEnabled 属性配置了使用混淆后,The ProGuard plugin 会自动被应用,并且自动创建一些任务。 android { buildTypes { release {

  • 问题内容: 很抱歉那个愚蠢的问题。如何在javascript切换大小写语言元素中为案件使用条件?像下面的示例一样,当变量<= 5和> 0 时,大小写应该匹配;但是,我的代码不起作用: 感谢您的任何建议! 问题答案: 这有效: 此答案的先前版本认为括号是罪魁祸首。实际上,括号在这里是无关紧要的-唯一必要的是您的case表达式必须为布尔值。 之所以起作用,是因为我们将给开关的值用作比较的依据。因此,同

  • 假设您有以下pyspark数据帧: 接下来的两个代码块应该做同样的事情-即,如果列不是<code>null<code>则返回该列的大写。但是,第二种方法(使用<code>udf</code>)会产生错误。 方法1:使用< code > py spark . SQL . functions . upper() 方法 2: 在 内部使用 这给了我< code > attribute error:“No