Sql 显示一个字段';s值,如果为null,则移动到下一个
我希望有人能帮我解决这个问题!我正在使用返回的数据填写表格。表格上有一个问题可以有多个答案,Q8ReasonA-Q8ReasonH。我的目标是按顺序显示每个答案,它们之间没有空格 例如,如果某人通过选择B、F和H回答问题8,我希望它显示:Sql 显示一个字段';s值,如果为null,则移动到下一个,sql,sql-server,Sql,Sql Server,我希望有人能帮我解决这个问题!我正在使用返回的数据填写表格。表格上有一个问题可以有多个答案,Q8ReasonA-Q8ReasonH。我的目标是按顺序显示每个答案,它们之间没有空格 例如,如果某人通过选择B、F和H回答问题8,我希望它显示: 问题八? 回答:B,F,H 现在它显示的是隔开的(例如,在答案所在的位置留下空白)。以下是我的部分代码: SELECT DISTINCT SFA.DOB, SFA.Name, SFA.SupvsrName, SFA.Question8,MFA.Q8Rea
SELECT DISTINCT SFA.DOB, SFA.Name, SFA.SupvsrName,
SFA.Question8,MFA.Q8ReasonA, MFA.Q8ReasonB, MFA.Q8ReasonC,
MFA.Q8ReasonD, MFA.Q8ReasonE, MFA.Q8ReasonF, MFA.Q8ReasonG, MFA.Q8ReasonH
FROM SingleFileAnswer SFA
JOIN MultipleFileAnswer MFA on SFA.SupvsrID=MFA.SupvsrID
WHERE SFA.SupvsrID=1234
您可以将
CASE
与STUFF
一起使用,以仅生成非空答案的逗号分隔值:
select distinct SFA.DOB,
SFA.name,
SFA.SupvsrName,
SFA.Question8,
STUFF(
case when MFA.Q8ReasonA is not null then ', A' else '' END +
case when MFA.Q8ReasonB is not null then ', B' else '' END +
case when MFA.Q8ReasonC is not null then ', C' else '' END +
case when MFA.Q8ReasonD is not null then ', D' else '' END +
case when MFA.Q8ReasonE is not null then ', E' else '' END +
case when MFA.Q8ReasonF is not null then ', F' else '' END +
case when MFA.Q8ReasonG is not null then ', G' else '' END +
case when MFA.Q8ReasonH is not null then ', F' else '' END
, 1, 2, '') answers
from SingleFileAnswer SFA
join MultipleFileAnswer MFA on SFA.SupvsrID = MFA.SupvsrID
where SFA.SupvsrID = 1234
如果要显示实际答案,请执行以下操作:
select distinct SFA.DOB,
SFA.name,
SFA.SupvsrName,
SFA.Question8,
STUFF(
coalesce(', ' + MFA.Q8ReasonA, '') +
coalesce(', ' + MFA.Q8ReasonB, '') +
coalesce(', ' + MFA.Q8ReasonC, '') +
coalesce(', ' + MFA.Q8ReasonD, '') +
coalesce(', ' + MFA.Q8ReasonE, '') +
coalesce(', ' + MFA.Q8ReasonF, '') +
coalesce(', ' + MFA.Q8ReasonG, '') +
coalesce(', ' + MFA.Q8ReasonH, '')
, 1, 2, '') answers
from SingleFileAnswer SFA
join MultipleFileAnswer MFA on SFA.SupvsrID = MFA.SupvsrID
where SFA.SupvsrID = 1234
您可以将字符串与
concat
函数连接在一起,并使用isnull
函数检查null
值。使用stuff
删除初始逗号和空格(从字符1
开始,并将2
字符替换为空字符串'
):
您在哪里以及如何将不同的答案连接在一起?您当前的脚本正在返回几个单独的字符串值。这简直是一个可怕的设计。你在这里违反了1NF,这会给你带来痛苦。你的答案应该是行而不是列。想想如果你想增加一个新的理由,这将是多么痛苦。您必须更改每个查询。如果你修改了设计,查询会很简单;这些只是从另一个查询返回的一些值,我在该查询中将特定的答案行转换为它们自己的列。该查询是动态的,将根据需要进行调整。这些答案是用户选择的结构化列表项。查询正在向表单提供要填写的数据。由于有多个用户,每个用户只能返回一行-因此将所有用户答案移动到一行/多列,而不是几列/多行。如果各个
Reason
列的值与A-H
列的值不同,则会出现这种情况,这也适用。有没有办法用CR代替逗号?这样它就可以将每个答案显示在新的一行而不是列表中。我认为这种处理方式在应用程序中处理得更好。您可以使用char(),但我不太喜欢这种方法,也不建议使用。谢谢!这很有效。有没有办法用CR代替逗号?因此,它将在新行而不是列表中显示每个答案?@Bester Per中的详细信息您应该使用char(10)
或char(10)+char(13)
,具体取决于您显示数据的位置。为了其他有相同问题的人的利益,如果这是你想要的答案,请将此标记为答案。我已经看过该问答,并尝试在上面的框架内使用char(),但它没有返回。这就是我在这里问的原因。@Bester你在哪里检查是否包括马车返回?SSMS中的输出窗口忽略换行符和回车符,我知道这是可行的,因为我已成功地将数据以这种方式输出到SSRS和excel,其中确实包含了换行符。以查询输入的形式。如上所述,它在我的表单中显示为:“原因A的文本,原因B的文本,,,,原因F的文本。”当我添加CHAR()时,它以相同的方式显示。
select distinct
SFA.DOB
,SFA.Name
,SFA.SupvsrName
,SFA.Question8
,MFA.Q8ReasonA
,MFA.Q8ReasonB
,MFA.Q8ReasonC
,MFA.Q8ReasonD
,MFA.Q8ReasonE
,MFA.Q8ReasonF
,MFA.Q8ReasonG
,MFA.Q8ReasonH
,stuff(concat(isnull(', ' + MFA.Q8ReasonA,'')
,isnull(', ' + MFA.Q8ReasonB,'')
,isnull(', ' + MFA.Q8ReasonC,'')
,isnull(', ' + MFA.Q8ReasonD,'')
,isnull(', ' + MFA.Q8ReasonE,'')
,isnull(', ' + MFA.Q8ReasonF,'')
,isnull(', ' + MFA.Q8ReasonG,'')
,isnull(', ' + MFA.Q8ReasonH,'')
)
,1,2,'') as Concatenated
from SingleFileAnswer as SFA
join MultipleFileAnswer as MFA
on SFA.SupvsrID = MFA.SupvsrID
where SFA.SupvsrID = 1234;