выберите, где х в у с различной длины - PullRequest
1 голос
/ 21 марта 2012

Извините, плохо описанный заголовок и не мог придумать, как его сформулировать.

Работа в системе, имеющей разрешения для многоуровневого просмотра.Чтобы лучше описать, что я имею в виду ...

         0th tier
        /   \
     3         5
   /   \      /   \
 3004 3005  5004  5008
  /
 3004001

Узлы пользователей (они могут принадлежать нескольким) назначаются через таблицу, структурированную как

ID | Node
---------
20 | 3004

Пользователь может принадлежать несколькимярусы.Работа над разделом безопасности - тот, кто принадлежит к 3004, должен иметь возможность редактировать кого-то, кто принадлежит к 3004001.

Я не уверен, как справиться со сравнением уровней различной длины, чтобы увидеть, кто должен иметь возможность работать с пользователем.редактировать.Конкретный пример: пользователь относится как к 3004, так и к 5. Как получить все идентификаторы ниже 3004 и ниже 5?

Существует ли чистый, многоразовый способ сделать это?Не нужно искать код с ложечкой, это было бы замечательно, если бы мы искали правильное направление.Спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Используйте сравнение LIKE в предложении WHERE.

SELECT [ID] FROM Table WHERE [Node] LIKE '5_%' OR [Node] LIKE '3004_%'

_% похоже на выражение "начинается с, но не равно". Таким образом, он не будет совпадать с «5» или «3004» в приведенном выше примере, но будет «50» или «3004001»

1 голос
/ 21 марта 2012

Я предположил, что узел является varchar или подобным. Если это int, вам нужно будет выполнить кастинг, чтобы использовать подход ниже. Мне не было ясно, был ли ID в вашей таблице UserID или нет, поэтому я жестко закодировал критерии WHERE:

select n2.*
from MyTable n1
inner join MyTable n2 on n2.Node like n1.Node + '%'
where n1.Node in ('5', '3004')

Если ID на самом деле UserID, вы можете сделать:

select n2.*
from MyTable n1
inner join MyTable n2 on n2.Node like n1.Node + '%'
where n1.ID = @UserID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...