【问题标题】:SELECT from database when i don´t know position of null values当我不知道空值的位置时从数据库中选择
【发布时间】:2023-03-21 18:18:01
【问题描述】:

下午好。我需要您的帮助才能正确查询数据库。

我在 DB 中有以下表格和地址,例如。

id street house_nuber city district
1 First street 1225 City One NULL
2 NULL 25 Small city NULL
3 Second street 51 Roswell District nine
4 Third street 15963 Last city Another district

在上表中,您可以看到我有地址。我在行中也有随机的 NULL 值。我的表目前大约有 50k 条记录。

PHP 代码用以下值填充变量

$street = 'First street';
$houseNum = 1125;
$city = 'City One';
$district = NULL;

我需要从匹配地址的数据库中返回 ID。如果我知道NULL值在哪里,查询很容易。

SELECT id FROM adress WHERE street=$street AND house_number=$houseNum AND city=$city AND district IS NULL

(通常我使用 PDO,这仅用于说明)

现在我的问题。如何进行查询,如果我无法预测,NULL 值在哪里? 我尝试使用空字符串进行查询,但是对于数据库而言,NULL 和空字符串不同,而且我总是返回错误。

谢谢你,祝你有美好的一天。

【问题讨论】:

  • 当您有一个带有 ID 和附加数据列的表时,指定 ID 的查询通常是“查找”或“检索”,而指定其他列的查询是“搜索”,即你有什么。搜索的时候,你只要把你知道的东西扔到数据库里,如果你不知道,就不包括它。这可能意味着动态构建您的 SQL 语句。还有spaceship operator 可能会有所帮助。
  • 嗨 Chriss Haas,我尝试申请宇宙飞船运算符,但这个运算符并没有解决我的问题。不管怎样,谢谢你的回复,我学到了一些新东西:)

标签: php mysql


【解决方案1】:

尝试下面的查询,它会发现街道、房屋等是否为空(匹配条件)

$query = "SELECT id FROM adress WHERE id>0 
AND street = IF($street != null, $street, NULL)
AND house_number = IF($houseNum != null, $houseNum, NULL)
AND city= IF($city != null, $city, NULL) 
AND district= IF($district != null, $district, NULL)

【讨论】:

    【解决方案2】:

    要精确匹配表中的行,您可以使用NULLIF() 将您的 PHP 空字符串转换为 SQL NULL 值,并使用NULL-safe operator 将 NULL 与它们进行比较而没有 NULL 结果。

    例如。 :

    $sql = <<<SQL
        SELECT id 
        FROM adress 
        WHERE TRUE 
            AND street <=> NULLIF({$pdo->quote($street)}, '')
            AND house_number <=> NULLIF({$pdo->quote($houseNum)}, '')
            AND city <=> NULLIF({$pdo->quote($city)}, '')
            AND district <=> NULLIF({$pdo->quote($city)}, '')
        SQL;
    

    【讨论】:

    • 您好 JCH77,感谢您的解决方案,它完美运行!我写信给克里斯说宇宙飞船操作员不适合我。显然,我用错了:-)。另外,我学到了一个很重要的功能。谢谢
    【解决方案3】:

    您可以像下面这样附加 where 条件:

    $street_query = $street != null ? " AND street='$street' " : " AND street IS NULL ";
    $houseNum_query = $houseNum != null ? " AND house_number='$houseNum' " : " AND house_number IS NULL ";
    $city_query = $city != null ? " AND city='$city' " : " AND city IS NULL ";
    $district_query = $district != null ? " AND district='$district' " : " AND district IS NULL ";
    
    $query = "SELECT id FROM adress WHERE 1 = 1 $street_query $houseNum_query $city_query $district_query";
    

    注意: 1 = 1 让下一个 AND + condition 始终是正确的查询。

    【讨论】:

    • 感谢您的回答。您的解决方案很有趣,但它不会完全解决我的情况。无论如何,它具有指导意义。谢谢。
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多