Sql server 如何将表中的bool列选择为VARCHAR?

Sql server 如何将表中的bool列选择为VARCHAR?,sql-server,Sql Server,我有下表: CREATE TABLE [dbo].[Answer] ( [AnswerId] INT IDENTITY (1, 1) NOT NULL, [QuestionId] INT NOT NULL, [Correct] BIT NULL ); 以下是一些典型数据: AnswerId QuestionId Correct 22 9

我有下表:

CREATE TABLE [dbo].[Answer] (
    [AnswerId]    INT              IDENTITY (1, 1) NOT NULL,
    [QuestionId]  INT              NOT NULL,
    [Correct]     BIT              NULL
);
以下是一些典型数据:

AnswerId   QuestionId   Correct
22         9            0
23         9            0
24         9            1
我需要得到答案

AnswerId   QuestionId   Correct
22         9            1
23         9            0
24         9            1
我需要得到答案101

试试这个:

SELECT *,
       '00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END 
FROM dbo.Answer
WHERE questionId = 9
编辑:为了保存变量的结果,请使用以下格式。(仅在变量上保存一条记录)


如果我理解正确,您必须将特定问题的
Correct
列中的所有值按照
AnswerId
的顺序列在一个串联字符串中

以下是特定
问题ID
(递归CTE)的通用解决方案

注意:将
@Answers
更改为表名,并删除表声明和插入


另一种解决方案是编写CLR函数来连接
Correct
列中的值。

一种简单的方法是: 将位转换为varchar 将“00”粘到开头 将整个转换为varchar(20)

比如:


输出应该是什么?选择查询构造以过滤questionid 9和orderby Answerid是您需要的,并且生成的列值为“001”。我说得对吗?在我看来,需要一个串联聚合函数。以下问题可能会有所帮助:,。为什么要这样反规范化数据?我如何将该值放入我声明的变量中?如果
AnswerId=22
的行在
Correct
列中包含
1
,会发生什么情况?我编辑我的帖子以使用变量。但您只能在变量上保存一条记录。@Pred-此答案无效。当我提到我需要看起来像001的数据时,我并不是真的认为答案会首先包括“00”。我需要的是正确列中数据的水平视图。如果
AnswerId=22的行在
correct
列中包含
1
,会发生什么情况?(再次:)@Pred那么我的查询的响应将是VARCHAR(20),其中包含“001”,这与OP要求的完全一样。我在这里遗漏了什么吗?如果OP想要的正是
001
字符串,那么连接就没有必要了。另一方面,如果OP希望以
应答ID
的顺序将
Correct
字段中的所有值列在一起,则此解决方案在大多数情况下根本不起作用。@Pred OP确实希望得到数据类型VARCHAR(20)的结果。(他没有说明原因,但在这种情况下,您应该将结果转换为VARCHAR(20)。)此外,OP没有要求任何类型的串联字段。他要求提供一种将位数据类型显示为VARCHAR(20)并填充零的方法。请再次阅读问题。OP从未要求将位数据类型强制转换为VARCHAR(20),但是,让OP决定他想要什么。这个答案确实有效,但我不确定我是否理解它是如何工作的。答案表最多只有十行,所以我想知道是否有更简单的方法来实现这一点。我会等着看是否有人能想出一个更简单的方法。这是一个(你可以自己阅读更多关于它们的内容)连接
值的方法。(有更多的解决方案可以做到这一点:使用函数和a)。CLR可能是最快的,但需要特殊的选项,而且它不是纯SQL解决方案。
Declare @YourVariable Nvarchar(20)

SELECT @YourVariable = '00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END 
FROM dbo.Answer
WHERE questionId = 9
DECLARE @Answers TABLE (
    [AnswerId]    INT              NOT NULL,
    [QuestionId]  INT              NOT NULL,
    [Correct]     BIT              NULL
);

INSERT INTO @Answers (AnswerId,QuestionId,Correct) VALUES
(22,         9,            0),
(23,         9,            0),
(24,         9,            1);


;WITH Partitioned AS (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY QuestionId ORDER BY AnswerId ASC) AS RowNumber
    , COUNT(1) OVER (PARTITION BY QuestionId) AS ColumnCount
    , CONVERT(VARCHAR(MAX), Correct) AS Correct
  FROM
    @Answers
  WHERE
    [QuestionId] = 9
),
Concatenated AS (
  SELECT RowNumber, ColumnCount, Correct FROM Partitioned WHERE RowNumber = 1

  UNION ALL

  SELECT
      P.RowNumber
      , P.ColumnCount
      , C.Correct + P.Correct AS Correct
  FROM
    Partitioned P
    INNER JOIN Concatenated C
        ON P.RowNumber = C.RowNumber + 1
)
SELECT
    CONVERT(VARCHAR(20), Correct) AS Correct
FROM
    Concatenated
WHERE
    RowNumber = ColumnCount
SELECT  Convert(VARCHAR(20),(CONVERT(VARCHAR(2),N'00') + CONVERT(VARCHAR(1),Correct))) as converted from Answer where (QuestionId=9) order by AnswerId;