我有一个显示以下值的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检查所有这些值是否存在
因此,
OptionID
当然只显示此Options
的{{1}}表中的所有选项OptionID
和NameID
所需的一般逻辑是这样的:
ValueID
布尔也可以。我尝试使用PIVOT看看它是否可以这样做,但这比我想的要多一些,但也许不是......有什么建议吗?
答案 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'
对此我很不满意,我不相信这些退货标签的含义。