【问题标题】:sql concat within a SELECT statementSELECT 语句中的 sql concat
【发布时间】:2014-12-23 03:11:03
【问题描述】:

这个和这个类似。 How to concatenate all columns in a select with SQL Server

但不完全是。这是 MS SQL 2008。我正在拉动患者的人口统计数据,其中之一是种族,这是一个多选领域(例如,您可以是亚洲人和中国人)。比赛表“PatientRace”通过患者 ID 链接到患者表。所以表结构是这样的:

Patient table
PatientID
PatientName
PatientAddress

PatientRace table
PatientRaceID
PatientID (FK)
Description

我只想要一行,我想要连接种族。是否可以在单个 SELECT 语句中执行此操作,或者我是否需要执行游标?我设想光标是这样的:初始选择所有其他人口统计数据,插入临时表。通过 PatientID 遍历临时表,然后为每一个获取比赛、连接并添加到临时表中。

所需的输出如下:每位患者 1 行。

姓名:“乔布洛”

种族:“亚洲人、中国人”

【问题讨论】:

  • 抱歉,“亚洲、中国”不是种族。
  • 一个问题。 PatientRace 表中的描述代表什么?
  • 您应该为您的Patient 表添加一个RaceId,并有另一个表RaceIdDescription。在您的解决方案中,一场比赛您将获得大量参赛作品。
  • @AndreDuarte 我认为重点是患者可以属于多个种族。将 RaceId 添加到 Patient 会破坏该目的。但是可能应该有一个Racetable 并且PatientRacetable 应该作为RacePatient 之间的连接表,以便规范关系。

标签: sql sql-server


【解决方案1】:

你需要像这样使用 STUFF 和 FOR XML

SELECT p.PatientName,
      (STUFF(SELECT ',' + r.Description 
             FROM PatientRace r 
             WHERE r.PatientID = p.PatientID
             FOR XML('')), 1, 1, '')
FROM Patients p

【讨论】:

  • 请注意这一点,因为如果没有TYPE,您可能会通过 XML 实体化得到丑陋的东西(怀疑在这种情况下,字符串中会有 <& 这样的字符,但是这可能不适用于所有读者)。我讲这个问题in this post
【解决方案2】:

在 SQL Server 中连接字符串值并不明显。它需要使用“xml”数据处理和子查询:

select p.*,
       stuff((select ', ' + Description
              from patientrace pr
              where pr.patientid = p.patientid
              for xml path ('')
             ), 1, 2, ''
            ) as races
from patients p;

【讨论】:

    【解决方案3】:

    对我来说,你已经编写了 fn_GetRaceByID(int PatientID) 之类的函数,它返回所需的字符串。所以在你的选择中使用它。您问题中的链接有很好的例子,如何做到这一点。

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2012-02-20
      • 2014-12-05
      • 2013-10-10
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多