在同一张表中使用“Like”函数比较两列数据

6

我正在尝试想出一种方法,在同一张表中查询两个不同列的值,使结果集显示columnB的值不包含columnA的值的实例。

例如,我的“Nodes”表包含“NodeName”和“DNS”列。这些值应该类似于以下内容:

NodeName    DNS
Router1     Router1.mydomain.com

我想运行一个查询,显示哪些行的DNS值不包含(或以)NodeName字段的值开头。我认为查询应该类似于以下内容,但显然在这种情况下使用“Like”时我漏掉了某些东西。

SELECT NodeName, DNS
WHERE DNS NOT LIKE 'NodeName%'

我正在使用SQL Server 2005,如果您有任何建议,将不胜感激... :)

2个回答

5
SELECT NodeName, DNS
WHERE DNS NOT LIKE NodeName + '%' AND DNS NOT LIKE '%' + NodeName + '%'

您的DNS LIKE 'NodeName%'是将字符串文字“NodeName”与DNS进行比较。

编辑:

Nissan Fan添加了NOT LIKE '%' + NodeName + '%'这意味着不需要 NOT LIKE NodeName + '%'

这取决于您想要“包含”还是“以...开头”:随您选择。

@Nissan Fan:谢谢:您应该将其发布为自己的答案...


1
我认为采用这种方法会忽略一个事实,即像Router11.mydomain.com这样的DNS实际上并不包含(或以)Router1作为节点名称。 - leoinfo
@leoinfo:说得好。只需要一个 NOT LIKE NodeName + '.%' 或类似的东西。 - gbn
无论如何,如果您想坚持使用LIKE,请注意只要有类似以下这样的内容就足够了: SELECT NodeName, DNS FROM Nodes WHERE DNS NOT LIKE '%' + NodeName + '.'% - leoinfo

0
SELECT USR.USER_ID, USR.LDAP_TITLE, LRM.LDAP_ROLE, LRM.ROLE_ID, RLS.PRIMARY_ROLE
FROM USERS USR, NEW_LDAP_ROLE_MATCH LRM, NEWROLES RLS
WHERE (INSTR(USR.LDAP_TITLE,LRM.LDAP_ROLE) > 0) 
AND LRM.ROLE_ID = RLS.ROLE_ID;

花了很多时间才使情境运作起来。请查看下面的链接以获取 SQL 查询。 http://www.anaesthetist.com/mnm/sql/query.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接