关于类似查询运算符

时间:2010-04-27 23:01:52

标签: sql sql-server sql-server-2005 tsql

对于以下数据(嗯..团队基础服务器表中有更多节点我需要参考。下面只是一个示例)

Nodes
------------------------
\node1\node2\node3\
\node1\node2\node5\
\node1\node2\node3\node4\
\node1\node2\node3\node4\node5\

我想知道我是否可以应用类似的东西(下面的查询没有给出所需的结果)

select * from table_a where nodes like '\node1\node2\%\'

获取以下数据

\node1\node2\node3\
\node1\node2\node5\

之类的东西(下面没有给出所需的结果)

select * from table_a where nodes like '\node1\node2\%\%\'

获取

\node1\node2\node3\
\node1\node2\node5\
\node1\node2\node3\node4\

可以使用喜欢运算符完成上述操作吗? PLS。建议。

由于

5 个答案:

答案 0 :(得分:1)

你需要结合两个词,LIKE和NOT LIKE:

select * from table_a where 
   nodes like '\node1\node2\%\' AND
   nodes NOT like '\node1\node2\%\%\'
第一个查询的

,第二个查询的类似解决方案。这是“普通SQL”。例如,可能有SQL Server特定的函数来计算列中“\”字符的数量。

答案 1 :(得分:0)

看起来这样可行(基本上只是消除了最后一个反斜杠):

select * from table_a where nodes like '\node1\node2\%\%'

修改

你也可以试试这个:

select * from table_a where 
      nodes like '\node1\node2\%\' or
      nodes like '\node1\node2\%\%\'

答案 2 :(得分:0)

也许使用分隔符来获取结果。 目前还不清楚你实际上想要得到什么,但你可以使用

substr

用于计算或查找分隔符'/'字符的位置。

答案 3 :(得分:0)

派对有点晚了,但似乎问题依然存在。可能是反斜杠正在逃避百分号的通配符含义吗?反斜杠n也可以被解释。

答案 4 :(得分:0)

sql-server不知道单个字符的通配符吗?

 select * from table_a 
   where nodes LIKE '#node1#node2#node_#';
        nodes        
---------------------
 #node1#node2#node5#
 #node1#node2#node3#

我在postgresql上测试了这个,很难插入反斜杠,这就是我用#替换它们的原因。

这是另一种可能性 - 否定多个反斜杠(为方便起见使用#):

SELECT * FROM table_a 
WHERE (nodes LIKE '#node1#node2#%#' 
  AND NOT nodes LIKE '#node1#node2#%#%#');

在postgresql上,也有可能匹配模式,SIMILAR TO或〜:

SELECT * FROM table_a 
WHERE nodes SIMILAR TO '#node1#node2#[^#]*#';
        nodes        
---------------------
 #node1#node2#node5#
 #node1#node2#node3#

[]封装一组可选的允许字符,例如[aeiou]将是一个小写的声音。但是当插入符号是括号中的第一个符号时,符号被否定,因此除了小写的声音之外,[^ aeiou]意味着什么,而[^#]意味着除了#之外的任何东西。 该表达式后面的星号表示前面的符号可以随意出现,0到100万次。 (+意味着至少一次,?意味着0或1次)。

所以'#node1#node2#[^#] *#'的意思是'#node1#node2#',后面跟着哈希,0或单次或多次,然后最后是一个哈希。