【问题标题】:SQL How to find parts of a field then put them in a new columnSQL如何查找字段的部分然后将它们放入新列中
【发布时间】:2015-06-12 17:11:53
【问题描述】:

对不起,标题含糊;我真的找不到一个很好的方法来把它变成一个简短的句子。所以这是我能想到的最详细的问题:

假设我有一张来自杂货店的下表,它连接了几个表(通过将供应商 ID、水果 ID 和供应商合同到期日期放在一个字段中,这些字段都是从我无法直接访问的表中获取的:

FRUIT ------------ EXTERNAL_ID
Apple              12AH==F1899==2008-04-04
Banana             167E==F17621==2009-01-18
Kiwi               892==F1009==2010-01-10
Pear               110YU==F987==2009-02-22

如果我需要将 external_ID 的第一部分放入一个新列中,该列添加到当前表的末尾以便于比较。然后对新列中的中间部分(代码开头总是有'F')做同样的事情......我该怎么做呢?

请记住,第一部分可以改变长度,所以我不能基于长度。我一直在考虑可能会一直到查询在字段中点击“=”,但我不知道该怎么做。

编辑:如果有帮助,请使用 TOAD Oracle。

【问题讨论】:

  • 这将完全取决于您使用的 SQL 引擎,因为它们对于 char-in-string 和 subtsring 操作都有不同的功能。请添加产品特定标签。
  • 您实际上是在尝试拆分分隔列表(您的分隔符是 == ),这是一个古老的 SQL 问题。这里有一篇关于多种方法的综合帖子:sqlperformance.com/2012/07/t-sql-queries/split-strings
  • @MartianCodeHound - 您的链接是针对 SQL Server 的,但操作问题是关于 Oracle 的。
  • 啊,这里有Oracle版本:blogs.oracle.com/aramamoo/entry/…

标签: sql oracle select toad


【解决方案1】:

在您提到它是针对 Oracle 之前,我使用的是 T-SQL,但原理保持不变。我将尝试使用 instr() 和 substr() 代替 charindex()、left() 和 right() 转换为 Oracle。这个概念是使用“=”作为分隔符,然后根据该字符在字符串中的位置将 external_id 解析为 3 个新列。

CREATE TABLE #myTbl
(
    fruit   CHAR(10),
    external_id CHAR(30),
    ext_num     CHAR(10),
    ext_code    CHAR(10),
    ext_date    DATETIME
)

INSERT INTO #myTbl (fruit, external_id)
VALUES('Apple','12AH==F1899==2008-04-04')

INSERT INTO #myTbl (fruit, external_id)
VALUES('Banana','167E==F17621==2009-01-18')

INSERT INTO #myTbl (fruit, external_id)
VALUES('Kiwi','892==F1009==2010-01-10')

INSERT INTO #myTbl (fruit, external_id)
VALUES('Pear','110YU==F987==2009-02-22')

SELECT * FROM #myTbl

UPDATE #myTbl
SET ext_num = LEFT(external_id,CHARINDEX('=',external_id)-1),
ext_code = LEFT(RIGHT(rtrim(external_id), len(external_id) - (CHARINDEX('=',external_id)+1)), CHARINDEX('=',RIGHT(rtrim(external_id), len(external_id) - (CHARINDEX('=',external_id)+1)-1))),
ext_date = RIGHT(rtrim(external_id),10)
FROM #myTbl

SELECT * FROM #myTbl

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 2012-11-11
    • 2022-01-08
    • 2018-08-16
    • 2021-10-04
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多