1

我的一个表有一个名为 MembersList 的字段,它是以LASTNAME/FIRSTNAME.MIDDLENAMEorMIDDLEINITIAL分号分隔的格式的名称列表(;)。例子:

DOE/JOHN.PETER;SMITH/ANDREW.K;FORD/HENRY.GEORGE

现在一个单独的记录可能包含 name DOE/JOHN.P,但是这个人可能DOE/JOHN.PETER和上面的例子不一样,他的 P 可能代表 Paul 或 Philip,但是我们服务的用户输入了他DOE/JOHN.P

如果我说

SELECT * FROM Events WHERE MembersList LIKE '%DOE/JOHN.P%'

我会得到记录DOE/JOHN.P以及DOE/JOHN.PETER不是我想要的记录。在DOE/JOHN.P这种情况下,应该将其视为他的中间首字母实际上是 P 并且只有 P。我尝试删除第二个%,但它没有返回任何内容。我应该是什么LIKE样子??

这有意义吗??

4

5 回答 5

2

您需要测试四个条件:

SELECT * FROM Events
WHERE MembersList = 'DOE/JOHN.P'
WHERE MembersList LIKE 'DOE/JOHN.P;%'
WHERE MembersList LIKE '%;DOE/JOHN.P'
WHERE MembersList LIKE '%;DOE/JOHN.P;%'

或者,如果您可以确定字符串中没有逗号,则可以使用FIND_IN_SET

SELECT * FROM Events
WHERE FIND_IN_SET('DOE/JOHN.P', REPLACE(MembersList, ';', ','))

不幸的是,FIND_IN_SET 仅适用于逗号分隔的列表,因此您必须在使用前将分号转换为逗号。

所有这些解决方案都会很慢。如果您可以将成员维护在单独的表中(正确规范化),并且仅在需要时建立以分号分隔的列表,那就更好了。

于 2012-10-05T14:12:39.907 回答
2
SELECT * 
FROM Events 
WHERE MembersList = 'DOE/JOHN.P' 
    or MembersList LIKE 'DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P' 
于 2012-10-05T14:12:40.227 回答
2

这是一种方法:

SELECT * FROM Events WHERE CONCAT(';',MembersList,';') LIKE '%;DOE/JOHN.P;%'

这里的诀窍是我们正在寻找分号分隔符,并且我们在我们正在搜索的字符串中添加一个前导和尾随分隔符。

或者,您可以避免添加前导和尾随分隔符,并在四个条件下进行测试。作为字符串中的中间元素,字符串中的第一个元素,字符串中的最后一个元素,以及字符串中唯一的元素:

LIKE '%;foo;%'
LIKE 'foo;%'
LIKE '%;foo'
LIKE 'foo'
于 2012-10-05T14:14:38.963 回答
1

您可以使用正则表达式而不是 like 检查名称是否以分号结尾或字符串是否在末尾

SELECT * FROM Events WHERE MembersList REGEXP 'DOE/JOHN\.P(;|$)'
于 2012-10-05T14:12:20.337 回答
0

%通配符。因此,如果您将它放在字符串 ( Doe/John.P%) 的末尾,它将找到以 P 结尾的任何内容以及该 P 之后的任何内容。

http://www.w3resource.com/sql/wildcards-like-operator/wildcards-like-operator.php

因此,如果您正在使用LIKE(%..%)语法并想要区分:LIKE 'DOE/JOHN.P'LIKE 'DOE/JOHN.PETER'您不能在之后放置通配符,P因为这将DOE/JOHN.P获取字符串中的任何内容。

%DOE/JOHN.P%会拿起两个.P.PETER

%DOE/JOHN.P会捡起任何以 a结尾的东西p


您可以将它们组合成一个or语句:

LIKE ... OR LIKE....并同时找到两者。

我建议=改用。

于 2012-10-05T14:13:04.453 回答