首先,如果这没有意义,我会对此感到非常困惑,但我会尽量保持清醒。
我有一个位置表,该表自动填充了存储在位置表列“名称”中的内容的密钥标识符。
一个例子是当创建员工时,在名称列中存储唯一员工ID,如果创建了员工的锁定器,则存储器ID存储在名称列中。完成此操作后,将创建一个名为Location ID的位置表的主键,它将存储在位置表(显然)和创建位置的所需表中,例如employee表作为示例。
员工的姓名存储在员工表中,我被要求通过位置表中存储的所有其他详细信息。
我在位置ID上执行了左连接,这样我仍然可以看到位置表中的所有其他项目,如Lockers。
然后我希望能够对Location_id或工程师名称进行搜索。
当我这样做时,我尝试了多种不同的方式 - 如果我用'%'搜索两者,我会看到所有内容,但是当我搜索员工姓名时,我会得到特定的员工以及其他所有内容,比如储物柜。我不希望这样。
我希望如此,如果您在两个%上搜索通配符,那么您会看到所有内容,如果您搜索特定名称,您只会看到具有该名称的工程师,如果您搜索位置ID,那么您只会看到该特定位置ID或类似的。
我目前的查询如下:
Select l.location_id, l.address_line_1, l.address_line_2, l.address_line_3, l.address_line_4, l.postcode, l.name, e.employee_name, l.location_type, l.mapped_wh_id, l.client_code
from T_3PL_location l
LEFT JOIN t_engineer e on l.location_id = e.location_id
WHERE l.location_id LIKE '%' AND (e.employee_name LIKE '%' OR e.employee_name is null)
ORDER BY l.location_id
然而,当我把: WHERE.location_id LIKE'%'和(e.employee_name LIKE'ScARVER'或e.employee_name为空)
然后: 如果我删除e.employee_name为null,则建议发生这种情况: 在%上搜索的第一个查询返回此项 - 仅显示工程师:
所以我需要一个查询(如果可能的话)并返回这些结果。
答案 0 :(得分:3)
您遇到的问题是数据库处理NULL(在这种情况下为Oracle,不同的DBMS:不同的行为)。使用%不适用于NULL。诀窍是使用NVL函数将NULL转换为空字符串:
Select l.location_id, l.address_line_1, l.address_line_2, l.address_line_3, l.address_line_4, l.postcode, l.name, e.employee_name, l.location_type, l.mapped_wh_id, l.client_code
from T_3PL_location l
LEFT JOIN t_engineer e on l.location_id = e.location_id
WHERE l.location_id LIKE '%' AND (NVL(e.employee_name,"") LIKE '%')
ORDER BY l.location_id;
NVL
函数检查值是否为NULL,如果结果为null,则返回替代值(在本例中为字符串)。然后将该字符串与LIKE
进行比较,现在应返回一个值。