【问题标题】:Serach row where first name and last name matches against full name separated by space搜索名字和姓氏与以空格分隔的全名匹配的行
【发布时间】:2022-12-15 03:38:26
【问题描述】:

我有两列first_namelast_name

要根据传递的搜索文本搜索行,我使用 iLik 查询。

SELECT * FROM t1 WHERE t.first_name ILIKE %John% or t.last_name ILIKE %John%;

以上作品。

但我想在名字和姓氏上搜索全名。它不返回该行。

SELECT * FROM t1 WHERE t.first_name ILIKE %John Doe% or t.last_name ILIKE %John Doe%;

以上为空结果。

我怎样才能使它在与搜索文本的子部分匹配的两个列上进行搜索?

【问题讨论】:

  • 你为什么使用 ILIKE?而不是 first_name = 'John'?
  • @S-Man 搜索文本将被传递给查询 它可能是JohnDoe,甚至可能是Joh,在这种情况下应该返回匹配的记录。所以问题是,如果 John Doe 被传递,则没有任何返回。

标签: sql postgresql


【解决方案1】:

我假设 John 和 Doe 在两个单独的列中,因此 t.first_name 中的“John”和 t.last_name 中的“Doe”。您的底部查询仅在其中一列中查找全名。如果名称已在两列之间拆分,则全名将不会出现在一列中。我 pressuming 列也将仅包含名字和姓氏,因此不需要 ILIKE,您只需运行等于,为了实现您的需要,请运行以下命令:

等于版本 - SELECT * FROM t1 WHERE t.first_name = 'John' AND t.last_name = 'Doe'; 通配符版本 - SELECT * FROM t1 WHERE t.first_name ILIKE %John% AND t.last_name ILIKE %Doe%;

让我知道你是怎么办的。

【讨论】:

  • 因此,您正在寻找“John”的first_name和“Doe”的last_name。我建议避免使用通配符,因为您最终可能还会找到不需要的名字,例如“John, McDoe”、“Robert John, Doe”、“John, Doe Smith”...
【解决方案2】:

我尝试使用 CONCAT 函数并且它正在工作,

SELECT *
FROM t1
WHERE CONCAT(t.first_name, ' ', t.last_name) ILIKE '%John Doe%';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多