Поиск, если существует на основе нескольких парных значений - PullRequest
1 голос
/ 14 февраля 2012

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

   SELECT NameID,Name,ValueID,Value FROM Options WHERE OptionID = 10000

Что приводит к:

 NameID  |  Name   |  ValueID  |  Value

 100     |  Color  |  10000    |  Black
 101     |  Size   |  10005    |  Large

Или иногда даже:

 NameID  |  Name   |  ValueID  |  Value

 100     |  Color  |  10000    |  Black
 101     |  Size   |  10005    |  Large
 102     |  Height |  10009    |  Tall
 103     |  Width  |  10006    |  Wide

Я пытаюсь написать хранимую процедуру, которая может позволить мне проверить, существуют ли ВСЕ эти значения на основе OptionID

Таким образом,

  1. Оператор позволил бы ввод OptionID, конечно, только показывать все опции в таблице Options для этого OptionID
  2. Оператор допускает ввод нескольких парных значений для NameID и ValueID

Общая необходимая логика будет выглядеть примерно так:

if ALL NameID and ValueID Pairs with-in an OptionID Exists
(as shown above in the results) 
   Then Return 'Unique Combination'
     Else Return 'Combination Exists'

Булево тоже будет хорошо. Я пытался использовать PIVOT, чтобы увидеть, можно ли это сделать таким образом, но это было немного больше, чем я думаю, мне нужно, но, возможно, нет .. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Вы можете использовать оператор if существующие.

if exists(SELECT NameID,Name,ValueID,Value FROM Options WHERE OptionID = @optionID and NameId = @NameID and ValueID = @ValueID)
begin
   --do whatever you want
end
else
begin
   --do whatever else you want
 end

Обновленный ответ

Declare @Loop as int,@POS int, @PAirs varchar(max),@CurrentPair varchar(max)
Declare @NameID as int,@ValueID as int, @Loop2 as int,@Pos2 int

SELECT @Pos = CHARINDEX(';', @Pairs, 1)
print @Pos
SELECT @Loop = CASE WHEN LEN(@Pairs) > 0 THEN 1 ELSE 0 END
    WHILE (SELECT @Loop) = 1
    BEGIN
        SELECT @Pos = CHARINDEX(';', @Pairs, 1)
        IF @Pos > 0
            BEGIN
                set @CurrentPair = SUBSTRING(@Pairs, 1, @Pos - 1) --Here it is a comma delimited string such as 100,20000
                set @Pairs = SUBSTRING(@Pairs, @Pos + 1, LEN(@Pairs) - @Pos) --This takes the current pair away from original string

                SELECT @Loop2 = CASE WHEN LEN(@CurrentPair) > 0 THEN 1 ELSE 0 END
                While (Select @Loop2) = 1
                    Begin
                        SELECT @Pos2 = CHARINDEX('2', @CurrentPair, 1)
                        If @Pos2 > 0
                            Begin
                                set @NameID = SUBSTRING(@CurrentPair, 1, @Pos2 - 1)
                                set @ValueID = SUBSTRING(@CurrentPair, @Pos2 + 1, LEN(@CurrentPair) - @Pos2)

                                if exists(SELECT NameID,Name,ValueID,Value FROM Options 
                                            WHERE NameId = @NameID and ValueID = @ValueID)
                                    begin
                                        --pair found
                                    end
                                else
                                    begin
                                        --pair not found
                                    end

                            End
                        Else
                            Begin
                                set @Loop2 = 0
                            End
                    End
            END
        ELSE
            BEGIN
                set @Loop = 0
            END
    END
0 голосов
/ 14 февраля 2012

Я бы сделал что-нибудь на основе SELECT... EXCEPT SELECT.... Сначала создайте и заполните временную таблицу переданными парами имя / значение, а затем выполните что-то вроде

IF exists (--  Everything passed in
           SELECT select NameId, Name, ValueId, Value
            from @TempTable
           --  Then remove everything that is in the table
           except select NameId, Name, ValueId, Value
            from Options
            where OptionId = @OptionId)
    RETURN 'All items passed were not found for this OptionId'
ELES
    RETURN 'All items passed were found within this OptionId'

Возмущайтесь этим, я не доверяю значению этих меток возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...