【问题标题】:Clean and choose SQL string value清理并选择 SQL 字符串值
【发布时间】:2021-12-28 20:10:01
【问题描述】:

我正在摄取与状态相关的数据,这些数据具有与状态名称相关的各种排列。例如,在下表中,我可以得到一个州名,例如“New Jersey”——这是正确的,但我也可以得到一个州名,例如“NewJersey”。

问题:从源提取数据时,这些值具有不同的 ID。因此,在处理转换时,会读取两个排列。

ID State
1 New Jersey
2 NewJersey

我想输出正确的排列名称。比如决赛桌应该是这样的:

ID State
1 New Jersey

注意:我曾经想过用MAX长度来识别字符串,但还没有将这个理论付诸实践。

我非常感谢您对此的任何帮助。

【问题讨论】:

  • 也许创建一个包含所有排列的表,假设你都知道它们,然后加入到该表的状态。所以 New Jersey 和 NewJersey 在您的排列表中设置为 1。
  • 嗨@Isolated 我试图实现一个映射表,但不幸的是,这是手动密集型的。我也无法访问源代码,也无法满足所有变化。
  • 假设您的数据与您的示例一样简单(这似乎不太可能),比较删除所有空格的字符串,然后取最长的一个。
  • 在不知道所有变化的情况下,我认为很难确定正确的转换方法。听起来您有时会将“North”显示为“North”、“N”、“No”、“Nrth”等。
  • 数据卫生是一场持久战。我建议获取一个邮政编码数据库,您可以在其中根据邮政编码进行验证和规范化,这不太可能产生变化(除了诚实的拼写错误)。

标签: sql sql-server database stored-procedures azure-sql-database


【解决方案1】:

正如@Ullas 在 cmets 中提到的,下面的代码给出了您预期的结果。

insert into tb1 values
(1,'New Jersey'),
(2,'NewJersey'),
(3, 'NewYork'),
(4, 'New York'),
(5, 'California')

通过State和state的长度替换和order之间的空格来获取行号。

select ID, State from 
  (
  select *, row_number() over(partition by replace(State, ' ','') order by replace(State, ' ',''), len(State) desc) rn  from tb1 
  )a
where rn=1
order by 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2021-11-03
    • 2013-10-06
    • 2013-01-30
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多