【问题标题】:SELECT only Unique values from Multiple Columns in SQL仅从 SQL 中的多列中选择唯一值
【发布时间】:2014-07-14 15:23:07
【问题描述】:

我必须将表中的大约 35 列连接成一个字符串。列中的数据可以在不同的情况下重复,如下所示。

COL_1
apple | ORANGE | APPLE | Orange 

COL_2
GRAPE | grape | Grape

每列中的数据是用管道分隔的,我试图通过用'|' 分隔来连接每一列。我希望最终输出为"apple | orange | grape"(全部小写即可)

但目前我得到了

apple | ORANGE | APPLE | Orange | GRAPE | grape | Grape

我当前的 SQL 是

SELECT COL_1 || '|' || COL_2 from TABLE_X;

有人可以解释一下如何从每一列中提取唯一值吗?这将大大减少我的字符串长度。我当前的 SQL 超过了 Oracle 的 4000 个字符限制。

【问题讨论】:

  • 你能告诉我们你用什么来得到这个结果吗?在 Oracle 中,SELECT DISTINCT LOWER(column) FROM 表将用于整理出唯一的小写值。
  • 你的问题是它没有标准化。执行此操作的最简单方法是在连接之前对其进行反透视,确保数据集是唯一的,然后使用LISTAGG() 之类的字符串聚合函数将其连接起来。您的问题被标记为 SQL Server Oracle。您需要它同时在 Oracle 上工作还是只在 Oracle 上工作?
  • 嗨 Ben,我只需要在 Oracle 中工作。批准了您的建议。
  • Hi Frazz,DISTINCT LOWER(COLUMN) 将消除跨列的不同。我想消除列中的重复项。列中的文本由 | 分隔并且在具有相同值的情况下是不同的。我只想从每列中提取唯一值。更新了我的例子
  • 嗯!!哎呀错字了!!!是的,它是“苹果 | 橙子 | 葡萄”

标签: sql oracle string-aggregation


【解决方案1】:

我试过这样做



WITH test AS ( SELECT 'Test | test | Test' str FROM dual ) SELECT * FROM (SELECT DISTINCT(LOWER(regexp_substr (str, '[^ | ]+', 1, rownum))) split FROM test CONNECT BY level <= LENGTH (regexp_replace (str, '[^ | ]+')) + 1 ) WHERE SPLIT IS NOT NULL;

这个查询只产生'test'

在拆分由 ' | 分隔的字符串后如何产生唯一值' 在列中。但是在单个 SQL 查询中对 35+ 列执行此操作会很麻烦。有人可以提出更好的方法吗?

【讨论】:

  • 您不需要这样做 35 次...如果您事先将所有内容连接在一起,那么这将准确地完成。使用 OPs 示例而不是查看。然后您可以使用LISTAGG() 重新聚合备份...确实没有更好的方法来保存完全更改数据库。这种方法的问题是,如果表格多于一行,就会可怕
  • 连接所有 35 列超过 oracle 限制的 4000 个字符并出现以下错误 ORA-12801: 并行查询服务器 P014 中发出错误信号,ORA-01489: 字符串连接的结果太长
  • 嗨 Ben,还有其他解决问题的方法吗?
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2012-08-20
  • 2014-12-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多