относительно как оператор запроса - PullRequest
0 голосов
/ 28 апреля 2010

Для приведенных ниже данных (ну ... в таблице серверов Team Foundation есть еще много узлов, на которые мне нужно сослаться. Ниже приведен только пример)

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 ]

1 голос
/ 28 апреля 2010

Вам нужно объединить два термина, КАК и НЕ, КАК:

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

для первого запроса и аналогичное решение для второго. Это с "простым SQL". Вероятно, существуют специальные функции SQL Server, которые, например, будут подсчитывать количество символов «\» в столбце.

0 голосов
/ 28 апреля 2010

Разве sql-сервер не знает подстановочный знак для одного символа?

 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 до миллиона раз. (+ будет означать хотя бы один раз,? будет означать 0 или 1 раз).

Итак, '# node1 # node2 # [^ #] * #' означает '# node1 # node2 #', за которым следует что угодно, кроме хэша, 0 или один или несколько раз, а затем, наконец, хеш.

0 голосов
/ 28 апреля 2010

возможно используйте разделитель, чтобы получить результаты. неясно, что вы на самом деле пытаетесь получить, но вы можете использовать

substr

функция для подсчета или определения положения символа разделителя '/'.

0 голосов
/ 28 апреля 2010

Немного опоздал на вечеринку, но, похоже, проблема все еще открыта. Может ли быть так, что обратные слэши избегают подстановочных знаков, обозначающих знаки процента? И обратная косая черта n также может быть интерпретирована.

0 голосов
/ 28 апреля 2010

Кажется, что это сработает (в основном, просто удаляя последний обратный слеш):

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

EDIT

Вы также можете попробовать это:

select * from table_a where 
      nodes like '\node1\node2\%\' or
      nodes like '\node1\node2\%\%\'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...