【问题标题】:SQL query to select a word from 100 columnsSQL查询从100列中选择一个词
【发布时间】:2019-09-14 11:39:43
【问题描述】:

Sh. North Miladhunmadulu - Shaviyani Atoll 这样的 Oracle 表中有 100 列。我需要一个查询来从上面只选择Shaviyani。请帮我。我需要选择- 之后和Atoll 之前的数据。

【问题讨论】:

  • 当您指的是 100 时,您实际上是指“行”(而不是“列”)吗?
  • 向我们展示一些示例表数据和预期结果 - 都是格式化文本,而不是图像。看看stackoverflow.com/help/mcve
  • 是的,此列中有 100 行名称相似的数据。

标签: sql oracle subquery substring


【解决方案1】:

假设您在谈论行而不是列。您可以使用多个逗号分隔的 CTE 来实现此目的。

以下查询有 3 个 cte 表。表t0 将使用charindex 函数拉动'-' 的位置。然后使用 charindex 函数我们可以找到应该在单词Shaviyani 之后的下一个空格。如您所见,'-' 后面有一个空格。因此,我们将在表t1 的t0.position 中添加+2,用于查找下一个空格的位置。表t3 将使用substring 函数得到最终结果。

declare @string nvarchar(50)='Sh. North Miladhunmadulu - Shaviyani Atoll';

with t0 AS (select charindex('-',@string) pos, @string name),
     t1 AS (select charindex(' ',@string,pos+2) pos,name from t0),
     t2 AS (select substring(@string,t0.pos+1,t1.pos - t0.pos) name
            from t0
            inner join t1 on t0.name = t1.name )

select * from t2

输出

name
--------------------------------------------------
 Shaviyani 

【讨论】:

  • 非常感谢它正在工作,我在不同的表中都有这些数据。如何根据不同列的列名进行选择。 K. 马累 - 卡夫环礁 S. Addu - 塞努环礁 K. 马累 - 卡夫环礁 K. 马累 - 卡夫环礁 AA。北阿里 - 阿里夫阿利夫环礁
  • 我有使用变量。您可以直接提及表名。例如,使用 t0 AS (select charindex('-',column.name) pos, column.name from table),
  • 一个在 Oracle 中不起作用的答案如何被接受,更不用说投票了?
【解决方案2】:

请使用SUBSTRINSTR如下

SELECT SUBSTR('Sh. North Miladhunmadulu - Shaviyani Atoll',instr ('Sh. North Miladhunmadulu - Shaviyani Atoll','-')+1,
        ((instr ('Sh. North Miladhunmadulu - Shaviyani Atoll','Atoll')-1) - instr ('Sh. North Miladhunmadulu - Shaviyani Atoll','-'))) as OUTPUT
    FROM dual;

这是Fiddle的输出

将字符串替换为列名,dual 替换为您的表名。

【讨论】:

  • 在用列名替换字符串并用你的表名替换字符串之后。它不工作。列名是“地址”,表名是“mydata”
  • 你检查过答案中附加的 Fiddle 的例子吗?
  • 至少,这在 Oracle 中运行。
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2013-03-01
  • 2012-10-15
  • 2012-12-01
相关资源
最近更新 更多