0

首先,这是我正在处理的表格的简化版本:

╔═══════╦═══════════╦══════════╦═══════════╗
║  ID   ║ FIRSTNAME ║ LASTNAME ║ COMPANYID ║
╠═══════╬═══════════╬══════════╬═══════════╣
║ 12345 ║ Bob       ║ Smith    ║         3 ║
║ 13826 ║ Bob       ║ Smith.Mr ║         3 ║
║ 16326 ║ Bob       ║ Smith Mr ║         3 ║
║ 16382 ║ Dr.Bob    ║ Smith    ║         3 ║
║ 18372 ║ Kim       ║ Johnson  ║         3 ║
╚═══════╩═══════════╩══════════╩═══════════╝

仅给定 ID 12345,我应该能够根据我从 12345 获得的名称和他的 companyID 获取所有记录,因此基本上所有来自 Company 3 的 Bob Smith 的所有记录。

我不知道如何处理这个查询,我需要一种方法从他的名字和姓氏中去除任何标题、空格或点。我假设我会将名字与姓氏连接起来并运行一个函数来删除我必须做的事情:

先生、博士、Jr、Sr等...

最后是鲍勃史密斯。我需要对与 id 12345 关联的名称执行此操作,并且还需要在WHERE子句中执行此操作,对吗?这将是比较名称。

我正在尝试使这个查询尽可能快速和高效,我应该使用 subSELECT吗?我应该创建一个FUNCTION? 不知道如何在.net.

任何想法将不胜感激。

编辑:应该提到客户也可能会向我发送 ID 13826,这是给 Bob Smith.Mr 的,我仍然需要从中获取 Bob Smith ID 12345,所以我想我肯定会删除标题等...

4

3 回答 3

2
SELECT  b.*
FROM    tableName a
        INNER JOIN tableName b
            ON a.companyID = b.companyID
WHERE   a.id = 12345 AND
        b.firstName LIKE CONCAT('%', a.firstName, '%') AND
        b.lastName LIKE CONCAT('%', a.lastName, '%')

输出

╔═══════╦═══════════╦══════════╦═══════════╗
║  ID   ║ FIRSTNAME ║ LASTNAME ║ COMPANYID ║
╠═══════╬═══════════╬══════════╬═══════════╣
║ 12345 ║ Bob       ║ Smith    ║         3 ║
║ 13826 ║ Bob       ║ Smith.Mr ║         3 ║
║ 16382 ║ Dr.Bob    ║ Smith    ║         3 ║
╚═══════╩═══════════╩══════════╩═══════════╝
于 2013-09-19T14:17:33.653 回答
0

尝试这个:

SELECT
    id,
    firstname,
    lastname,
    companyID
FROM
    my_table
WHERE
    companyID = (SELECT companyID FROM my_table WHERE id = 12345)
    AND firstname LIKE CONCAT('%',(SELECT firstname FROM my_table WHERE id = 12345),'%')
    AND lastname LIKE CONCAT('%',(SELECT lastname FROM my_table WHERE id = 12345),'%')

或者最快的方法:

 SELECT
        id,
        firstname,
        lastname,
        companyID
    FROM
        my_table
    WHERE
        companyID = @companyID
        AND firstname LIKE '%@firstname%'
        AND lastname LIKE '%@lastname%'

其中@companyID,@firstname,@lastname 是此查询的值:

SELECT companyID,firstname,lastname FROM my_table WHERE id = 12345
于 2013-09-19T14:19:21.143 回答
0

您需要标准化您的数据。

首先,申请

lower(name)

将全部转换为小写

第二个正常步骤是移除 MR。和东西。你这样做REPLACE(name, "mr.", "")

如果你有其他垃圾不要忘记 substring_index 存在 substring_index(name, 'Mr.', -1)将返回字符串的一部分到先生的右边。

完成后,只需按照其他人所说的做,减去正则表达式

    select * 
from table as t1 
inner join table as t2 
on t1.firstname=t2.firstname 
and t1.lastname=t2.lastname 
and t1.companz=t2.companz 
where t2.user_id=12345

开始你,你正在寻找

create table step1
select id, lower(name) as name,... from user;
create table step2
select id, replace(name, "mr.", "")... from step1;
于 2013-09-19T16:11:34.290 回答