【问题标题】:Translating a column containing comma separated codes翻译包含逗号分隔代码的列
【发布时间】:2021-01-18 16:30:17
【问题描述】:

我正在尝试报告一些数据,其中一列需要包含逗号分隔的 2 字符代码列表,然后我需要将其“翻译”回它所代表的描述,例如假设这是关于人和他们的个性特征。数据是这样存储的:

person_id traits
1 OU,AD
2 AB,CD,EF,GH,IJ

并说这些“代码”代表如下描述:

OU = Outgoing AD = Adventurous

等等。所以对于 person_id = 1 我希望 Traits 的输出是:

Outgoing, Adventurous

有一组可以列出的代码列表,没有查找表来将代码与其描述相匹配,并且每条记录在traits 列中可以有不同数量的代码。

如上“翻译”此列的最佳方式是什么?

【问题讨论】:

  • 修复你的数据模型!在字符串中存储逗号分隔的值是一种 SQL 反模式。
  • 拆分字符串(在Stack Overflow 中有 1,000 个如何执行此操作的重复项),然后将 JOIN 拆分到您的查找表中(还有很多骗子,还有文档和教程) .虽然 真正的 解决方案是修复您的设计并停止在 RDBMS 中存储分隔数据。
  • “修复数据/设计”正在向合唱团讲道 - 我无法控制这一点 - 不幸的是,如上所述,它无助于解决我的问题。
  • 如果在 SQL 2016 或更高版本上存在 STRING_SPLIT 函数 docs.microsoft.com/en-us/sql/t-sql/functions/… - 如果没有,则 google Jeff Moden String Split 或点击此链接:sqlservercentral.com/articles/…

标签: sql sql-server split


【解决方案1】:

您可以只嵌套一些 REPLACE() 函数...这不是最花哨的解决方案,但它应该可以工作。

样本数据

create table people
(
   person_id int,
   traits nvarchar(100)
);

insert into people (person_id, traits) values
(1, 'OU,AD'),
(2, 'AB,CD,EF,GH,IJ');

解决方案

select p.person_id,
       replace(                  --EF
       replace(                  --AD
       replace(p.traits,         --OU
       'OU', 'Outgoing'),
       'AD', 'Adventurous'),
       'EF', 'Efficient')
       as traits
from people p;

结果

person_id traits
--------- --------------------------
1         Outgoing,Adventurous
2         AB,CD,Efficient,GH,IJ

Fiddle 看看它的实际效果。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多