在SQL中解码的逻辑

时间:2017-07-20 12:17:24

标签: sql

我有一个SQL表,其值为2的幂(这基本上是多项选择题答案)

ID | Value | Answer   | QuestionId
1  |    1  | Answer 1 |  1
2  |    2  | Answer 2 |  1
3  |    4  | Answer 3 |  1
4  |    8  | Answer 4 |  1

我有另一张表,其中包含用户选择的选项。但总结了这些选择。就像用户只选择了第一个选项一样,如果用户选择了第一个和第二个,则结果为1,结果为3.如果用户选择了第一个和第三个,则结果为5,依此类推。

QuestionId | Result
1          |  3
2          |  1

我想取回从此结果中选择的选项。我怎么能在SQL

中做到这一点

如果问题不明确,请告诉我。

3 个答案:

答案 0 :(得分:3)

由于您只有四个可能的答案,最简单的解决方案(以后读取代码时最容易理解)可能只是创建一个值为0-15的查找表作为键,另外四列的值显示为根据每个键选择了哪些答案。它不像位掩码那么优雅,但我认为你的维护程序员可能会在以后感谢你。

答案 1 :(得分:0)

您可以使用

之类的表达式
select cast(Result::bit(4) & B'0001' as int)
union select cast(Result::bit(4) & B'0010' as int)
union select cast(Result::bit(4) & B'0100' as int)
union select cast(Result::bit(4) & B'1000' as int);

(这适用于Postgres;根据需要进行调整。)

答案 2 :(得分:0)

  

@AlexK,是的,它是用bitmasked来编写的。这是在C#代码中完成的。现在我们需要在SQL中进行分解。我怎么能这样做?

使用&

CREATE TABLE T(ID INT, Value INT) INSERT T VALUES 
  (1, 1),
  (2, 2),
  (3, 4),
  (4, 8)

DECLARE @CHOICE INT = 1 | 4

SELECT * FROM T
WHERE
   @CHOICE & Value != 0

有关

ID  Value
1   1
3   4