如何从字符串中提取文本并将其保存为两列并在第三列的末尾添加字符
Posted
技术标签:
【中文标题】如何从字符串中提取文本并将其保存为两列并在第三列的末尾添加字符【英文标题】:How do i extract texts from string and save it as two columns and add character at the end for third column 【发布时间】:2021-11-04 23:39:51 【问题描述】:我正在使用 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]
【问题讨论】:
您不能直接使用 Transact SQL 从图像中提取文本。您的第一步应该是有一个包含数据的表格。我们也一样!请提供查询以创建表并插入示例数据而不是图像。此外,我们需要知道您的异常结果是什么。注意:我假设您使用的是专用的 azure synapse - 如果不是这种情况,那么数据的来源是什么?谢谢。 不,我不想从图像中提取文本,第一个屏幕截图显示了来自源的列名(Table_Name),我想使用子字符串拆分它并创建两列作为 Landing_Schema_Name 和 Source_Table_Name跨度> 正如我上面写的,我们需要简单的查询来创建表和插入示例数据,而不是截图或表和列的描述。花几秒钟的时间编写查询。如果您不知道如何创建表或插入行,那么我们首先需要帮助您。如果这对您来说是个问题,请通知我们(SSMS 有一个工具可以提供查询来创建表) INSERT INTO Utility.CDC_Load_Register ( [Table_Name] ,[Loaded_On] ) 选择子字符串(Table_name, charindex('_',Table_name)+1, Len(Table_name) - charindex('.',Table_name )) as Landing_Schema_Name, SUBSTRING(e. [Table Name],y) AS Source_Table_Name, SUBSTRING(e. [Table Name],y) & ”__GM” AS Landing_Table_Name, (e.[Loaded On]) AS Replication_Commenced_DT, NULL AS Record_Updated_DT FROM [e].[Load_History_test] as e 我弄清楚了提取的语法,它有效,谢谢 Ronen Select SUBSTRING(Table_name, LEN(LEFT(Table_name, CHARINDEX ('', Table_name))) + 1, LEN(Table_name ) - LEN(LEFT(Table_name, CHARINDEX ('', Table_name))) - LEN(RIGHT(Table_name, LEN(Table_name) - CHARINDEX ('.', Table_name))) - 1) as Landing_Schema_Name, Substring (Table_name, Charindex('.', Table_name)+1, LEN(Table_name)) 作为 Source_Table_Name, Substring(Table_name, Charindex('.', Table_name)+1, LEN(Table_name)) + '__GM' 作为 Landing_Table_Name,来自[e].[Task_Load_History_test] as e 【参考方案1】:在提出此类问题时,最好按照 Ronen 的建议提供一些示例数据和预期结果。对于 SQL 问题,一个非常好的方法是使用临时表和示例数据,如下所示:
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 的标准开始,这是在 *** 上获得良好答案的秘诀。我已将 SELECT
与 UNION ALL
一起使用,因为 Azure Synapse 目前不支持多条记录的 VALUES
子句。
对于预期的结果,最好将它们显示在表格中,如下所示:
col1 | col2 | col3 |
---|---|---|
PRD1T | FINAPP | HOLCONTRACT |
PRD1T | FINAPP | TOCCASE |
通过这种方式,人们可以清楚地了解您的期望。不清楚为什么您的屏幕打印中有两个 TOCCASE
示例。
对于您的问题,有不止一种方法。 CHARINDEX
、SUBSTRING
和 LEFT
是正确的,但事情可能会开始变得复杂。因此,我倾向于在公用表表达式 (CTE) 中包含一些复杂性,请参见下面的示例。还有一种名为PARSENAME
的内置SQL 函数的“技巧”方法。这旨在从 SQL Server 中常见的四部分对象名称中提取,例如<server-name>.<database-name>.<schema-name>.<object-name>
。只要您的对象名称永远不会超过四个部分,这种方法就可以为您工作。请参阅PARSENAME
here 的主要帮助。请参阅下面的完整演示,该演示使用临时表端到端运行以演示不同的原理:
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;
【讨论】:
谢谢 Bob,我当然会提供样本数据和预期的输出以上是关于如何从字符串中提取文本并将其保存为两列并在第三列的末尾添加字符的主要内容,如果未能解决你的问题,请参考以下文章