我的一个表有一个名为MembersList的字段,它是一个由分号LASTNAME/FIRSTNAME.MIDDLENAMEorMIDDLEINITIAL
分隔的(;)
格式的名称列表。例如:
DOE/JOHN.PETER;SMITH/ANDREW.K;FORD/HENRY.GEORGE
现在一个单独的记录可能包含名称DOE/JOHN.P
,但此人可能与上面示例中的DOE/JOHN.PETER
不同,他的P可能代表保罗或菲利普,但是我们的服务只是DOE/JOHN.P
。
如果我说
SELECT * FROM Events WHERE MembersList LIKE '%DOE/JOHN.P%'
我将获得DOE/JOHN.P
的记录以及DOE/JOHN.PETER
的记录,这不是我想要的。在这种情况下,DOE/JOHN.P
应该被视为他的中间首字母实际上是P而且只有P.我已经尝试删除第二个%
但它什么也没有返回。我的LIKE
应该是什么样的?
这有意义吗?
答案 0 :(得分: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仅适用于以逗号分隔的列表,因此您必须在使用分号前将分号转换为逗号。
所有这些解决方案都将变得缓慢。如果你可以将成员保存在一个单独的表中(正确规范化),并且只在你需要它时建立分号分隔列表,那会更好。
答案 1 :(得分: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'
答案 2 :(得分:2)
这是一种方法:
SELECT * FROM Events WHERE CONCAT(';',MembersList,';') LIKE '%;DOE/JOHN.P;%'
这里的技巧是我们正在寻找分号分隔符,并且我们在我们正在搜索的字符串中添加一个前导和尾随分隔符。
或者,您可以避免添加前导和尾随分隔符,并在四个条件上进行测试。作为字符串中的中间元素,字符串中的第一个元素,字符串中的最后一个元素,以及字符串中唯一的元素:
LIKE '%;foo;%'
LIKE 'foo;%'
LIKE '%;foo'
LIKE 'foo'
答案 3 :(得分:1)
您可以使用正则表达式而不是喜欢检查名称是否以分号结尾或字符串是否在末尾 p>
SELECT * FROM Events WHERE MembersList REGEXP 'DOE/JOHN\.P(;|$)'
答案 4 :(得分:0)
%
是一个通配符。所以,如果你把它放在一个字符串的末尾(Doe/John.P%
),它会在那个P之后找到任何以P和ANYTHING结尾的东西。
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
会在p
您可以将它们合并为or
声明:
LIKE ... OR LIKE....
并同时找到两者。
我建议改用=
。