如何从表中选择bool列到VARCHAR?

时间:2014-07-23 10:17:03

标签: 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            0
23         9            0
24         9            1

我需要得到答案001

AnswerId   QuestionId   Correct
22         9            1
23         9            0
24         9            1

我需要得到答案101

3 个答案:

答案 0 :(得分:1)

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

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

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

注意:@Answers更改为您的表格名称并删除表格声明和插入内容。

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

答案 1 :(得分:-1)

试试这个:

SELECT *,
       '00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END 
FROM dbo.Answer
WHERE questionId = 9

编辑:为了在变量上保存结果,请使用以下格式。 (在变量上只保存一条记录)

Declare @YourVariable Nvarchar(20)

SELECT @YourVariable = '00'+CASE WHEN correct = 1 THEN '1' ELSE '0' END 
FROM dbo.Answer
WHERE questionId = 9

答案 2 :(得分:-1)

一种直截了当的方式是: 将位转换为varchar 胶水" 00"到了开头 将整数转换为varchar(20)

像:

SELECT  Convert(VARCHAR(20),(CONVERT(VARCHAR(2),N'00') + CONVERT(VARCHAR(1),Correct))) as converted from Answer where (QuestionId=9) order by AnswerId;