我如何从字符串中提取文本并将其保存为两列并在第三列的末尾添加字符

How do i extract texts from string and save it as two columns and add character at the end for third column

我正在使用 TSQL,我想从字符串中提取文本并将其保存为两列和第三列

以下代码不完整,只是去掉了 PRD1T_ Finapp,不确定如何满足文本的其余部分

Select substring(Table_name,
charindex('_',Table_name)+1,
Len(Table_name) - charindex('.',Table_name)) as Landing_Schema_Name
FROM [e].[Load_History_test]

当提出这样的问题时,最好提供一些样本数据和预期结果,正如 Ronen 所建议的那样。对于 SQL 问题,一个非常好的方法是使用临时 table 和示例数据,如下所示:

CREATE TABLE #load_history_test ( 
    table_name  VARCHAR(100)
);

INSERT INTO #load_history_test 
SELECT 'PRD1T_FINAPP.HOLCONTRACT'
UNION ALL
SELECT 'PRD1T_FINAPP.TOCCASE'
UNION ALL
SELECT 'PRD1T_FINAPP.TOCCASE';

因此,这提供了人们可以 运行 并开始达到 minimal, reproducible example 的标准,这是在 Whosebug 上获得良好答案的秘诀。我将 SELECTUNION ALL 一起使用,因为 Azure Synapse 目前不支持多个记录的 VALUES 子句。

对于预期的结果,通常最好将它们显示在 table 中,例如:

col1 col2 col3
PRD1T FINAPP HOLCONTRACT
PRD1T FINAPP TOCCASE

这样人们就可以清楚地了解您的期望。不清楚为什么您的屏幕打印中有两个 TOCCASE 示例。

对于你的问题,有不止一种方法。 CHARINDEXSUBSTRINGLEFT 是正确的,但事情可能开始变得复杂起来。因此,我倾向于将一些复杂性包含在通用 Table 表达式 (CTE) 中,请参见下面的示例。还有一种 'trick' 方法,带有一个名为 PARSENAME 的内置 SQL 函数。这旨在从 SQL 服务器中常见的四部分对象名称中提取,例如 <server-name>.<database-name>.<schema-name>.<object-name>。只要您的对象名称永远不会超过四个部分,这种方法就适合您。请参阅 PARSENAME here 的主要帮助。请参阅下面的完整演示,其中 运行 以临时 table 结尾到结尾以演示不同的原则:

IF OBJECT_ID('#load_history_test') IS NOT NULL
    DROP TABLE #load_history_test;

CREATE TABLE #load_history_test ( 
    table_name  VARCHAR(100)
);

INSERT INTO #load_history_test 
SELECT 'PRD1T_FINAPP.HOLCONTRACT'
UNION ALL
SELECT 'PRD1T_FINAPP.TOCCASE'
UNION ALL
SELECT 'PRD1T_FINAPP.TOCCASE';


;WITH cte AS (
SELECT 
    table_name AS original_table_name,
    CHARINDEX( '_', table_name ) underscorePos,
    CHARINDEX( '.', table_name ) stopPos,
    REPLACE( table_name, '_', '.' ) AS clean_table_name
FROM #load_history_test
)
SELECT
    *,
    PARSENAME( clean_table_name, 3 ) a,
    PARSENAME( clean_table_name, 2 ) b,
    PARSENAME( clean_table_name, 1 ) c,
    LEFT( original_table_name, underscorePos - 1 )  getItemBeforeUnderscore,
    SUBSTRING( original_table_name, underscorePos + 1, ( ( stopPos - 1 ) - underscorePos ) ) AS getItemAfterUnderscore,
    SUBSTRING( original_table_name, stopPos + 1, 99 )  getItemAfterStop
FROM cte;