“Where 1 = 1 的存在意义”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第4行: 第4行:
 
根据 <u>书的名字</u> 和 <u>作者的名字</u> 查询书籍,但 <u>书的名字</u> 和 <u>作者的名字</u> 又都不是必填项,可填、可不填。
 
根据 <u>书的名字</u> 和 <u>作者的名字</u> 查询书籍,但 <u>书的名字</u> 和 <u>作者的名字</u> 又都不是必填项,可填、可不填。
  
那么在进行 SQL 拼接的时候就可以:
+
那么在进行 SQL 拼接的时候就可以:<syntaxhighlight lang="java">
 +
    public String getSQL(String bookName, String author) {
 +
        String initSQL = "select * " +
 +
                "from book " +
 +
                "where 1 = 1 ";
  
 +
        StringBuffer buffer = new StringBuffer(initSQL);
 +
        if (StringUtils.isNotBlank(bookName)) {
 +
            buffer.append("and book_name like '%").append(bookName).append("%'");
 +
        }
  
 
+
        if (StringUtils.isNotBlank(author)) {
 
+
            buffer.append("and author like '%").append(author).append("%'");
实际场景应该要更复杂一些,书店里的自助查询终端一般是使用了文本搜索引擎的:
+
        }
 
+
        return buffer.toString();
先对输入的字符串做分词、然后再和已经用  <u>书的名字</u> <u>作者的名字</u> 做了反向索引的数据库数据进行模糊匹配。
+
    }
 +
</syntaxhighlight>
 +
所以 <code>1 = 1</code> 的作用其实是把 <code>where</code> 固定下来,即便一个条件都没有,<code>where</code> 仍然可以存在

2023年8月15日 (二) 03:26的版本

示例

场景是我们要实现一个这样的常见查询功能:

根据 书的名字作者的名字 查询书籍,但 书的名字作者的名字 又都不是必填项,可填、可不填。

那么在进行 SQL 拼接的时候就可以:

    public String getSQL(String bookName, String author) {
        String initSQL = "select * " +
                "from book " +
                "where 1 = 1 ";

        StringBuffer buffer = new StringBuffer(initSQL);
        if (StringUtils.isNotBlank(bookName)) {
            buffer.append("and book_name like '%").append(bookName).append("%'");
        }

        if (StringUtils.isNotBlank(author)) {
            buffer.append("and author like '%").append(author).append("%'");
        }
        return buffer.toString();
    }

所以 1 = 1 的作用其实是把 where 固定下来,即便一个条件都没有,where 仍然可以存在