【问题标题】:search in database table by multiple column that maybe not set通过可能未设置的多列在数据库表中搜索
【发布时间】:2021-01-12 17:42:58
【问题描述】:

我有一个包含任何列的数据库表。 UI页面中有3个表单输入,用户可以通过这些输入在表格中搜索一个值。用户可以为一列(输入)、两列或全部插入值。表示其中一个或两个输入值可能为 null 并且用户不使用它们进行搜索。 如何创建搜索查询?因为下面的代码有问题。如果用户不插入所有 3 列的值,此查询将出错。

$query="SELECT * FROM insurance WHERE nationalCode=:nationalCode AND insuranceNumber=:insuranceNumber 
AND insuranceType=:insuranceType;";

换句话说,如果用户定义了 3 列的值,我需要在表中搜索 3 列,否则如果用户有 2 列的插入值,则搜索将通过这两列进行,如果用户只有插入值for 1 of column search 将按该 1 列进行。

【问题讨论】:

  • 你试过用OR 代替AND 吗?
  • 那么 :insuranceType 不设置的值是多少?
  • 亲爱的@ O.Jones 或者对我的黄金没有用处。因为如果用户将值插入所有输入,我需要按所有用户输入进行搜索。

标签: mysql where-clause


【解决方案1】:

如果用户没有插入值,比如nationalCode,我假设您将NULL(或空字符串?)作为:nationalCode 传递,在这种情况下,您的条件应该是:

nationalCode = :nationalCode OR :nationalCode IS NULL

或:

nationalCode = :nationalCode OR :nationalCode = ''

所以对于所有列,语句应该是:

SELECT * 
FROM insurance 
WHERE (nationalCode = :nationalCode OR :nationalCode IS NULL)  
  AND (insuranceNumber = :insuranceNumber OR :insuranceNumber IS NULL)   
  AND (insuranceType = :insuranceType OR :insuranceType IS NULL);

【讨论】:

  • 为您解答。我试过你的提议,但这个查询不起作用。我认为是因为通过使用您的 Query mySQL 搜索数据库表中具有空值的列。
  • @HadiTaj 查询不搜索空值。它会检查您传递的参数值(例如 :nationalCode)是否为空。当用户没有为nationalCode 提供值时,您将什么值传递给查询?
  • 为您解答。我试过你的提议,但这个查询不起作用。我认为是因为通过使用您的 Query mySQL 搜索数据库表中具有空值的列。例如(通过使用您的查询)如果用户插入“nationalCode”并且没有定义“insuranceType”和“insuranceNumber”的值,那么mySQL将搜索具有nationalCode列的用户输入值并且没有insuranceType值的记录& insuranceNumber 列。我想找到对所有列都有值的行,但用户 mybe 没有定义其中的一些值。
  • if(isset($_POST["nationalCode"])){ $nationalCode=$_POST["nationalCode"]; }else{ $nationalCode=null; }
  • @HadiTaj 如果用户没有定义“insuranceType”和“insuranceNumber”的值,那么:insuranceNumber IS NULL:insuranceType IS NULL都将返回true,并且语句中的唯一条件是:@987654331 @.
【解决方案2】:

亲爱的@forpas,我已经使用了您的查询,但没有成功。但是您提供的查询中的微小变化已经到了我的黄金。 我使用了你的两个代码: nationalCode = :nationalCode 或 :nationalCode = '' 和 nationalCode = :nationalCode 或 :nationalCode 为空 确实,我将您建议的查询更改如下:

        $query="SELECT * FROM insurance WHERE 
    (nationalCode=:nationalCode OR :nationalCode IS NULL OR :nationalCode='') AND
    (insuranceNum=:insuranceNum OR :insuranceNum IS NULL OR :insuranceNum='') AND
    (insuranceType=:insuranceType OR :insuranceType IS NULL OR :insuranceType='');";

所以坦克需要你的帮助。

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多