根据多个配对值查找EXISTS

时间:2012-02-14 15:33:27

标签: sql-server sql-server-2008 tsql

我有一个显示以下值的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的{​​{1}}表中的所有选项
  2. 该声明允许为OptionIDNameID
  3. 输入多个配对值

    所需的一般逻辑是这样的:

    ValueID

    布尔也可以。我尝试使用PIVOT看看它是否可以这样做,但这比我想的要多一些,但也许不是......有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用if exists语句。

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

答案 1 :(得分:0)

我会根据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'

对此我很不满意,我不相信这些退货标签的含义。