【问题标题】:Finding specific part of text in a field which starts with a specific character in SQL server在 SQL Server 中以特定字符开头的字段中查找文本的特定部分
【发布时间】:2020-03-26 08:32:17
【问题描述】:

我想编写一个内部连接,其中 Table_1 的标识符是一个唯一字段,而用于连接的 Table_2 的字段具有嵌入在文本中的标识符值,并且该文本以 "DJ_" 开头.在这里,我想从 Table_2 中提取那些仅以 "DJ_" 开头的元组中的标识符值,而不是任何其他文本。

例如,Table_1 的连接标识符值为 12345。相同的标识符是 Table_2 中文本字段的一部分;文本看起来像 “DJ_12_XYZ_1_YTR_12345.trt”。因此,我希望删除“12345”之前和之后的文本,同时将其作为 Table_2 的标识符加入。

【问题讨论】:

  • 哪个版本的sql server?访问 string_split 会影响答案。如果你是设计师,加入一些字符串对性能来说是很糟糕的,如果可能的话应该标准化。
  • 版本是2014。而且,这不能规范化,因为这是唯一可以加入表格的字段。
  • 看看LIKE。要获得更详细的答案edit 您的问题,并包括表格的CREATE TABLE 语句、INSERT INTO 语句的示例数据以及表格文本形式的示例数据的所需结果。还要添加您到目前为止的查询。
  • 如果您使用的是 2014,为什么要标记 2008 和 2012..?
  • 表2中标识符的格式是否一致?

标签: sql sql-server tsql sql-server-2008 sql-server-2012


【解决方案1】:

你有一个简单的问题和一个更难的问题。

要获取您想要加入的以 DJ_ 开头的记录...

一个简单的where LEFT(string,3) = 'DJ_'

现在把号码拿出来。

这个很好玩……

substring(right('DJ_12_XYZ_1_YTR_12345.trt',charindex('_',reverse('DJ_12_XYZ_1_YTR_12345.trt'),1)),2,5)

【讨论】:

    【解决方案2】:

    下面是一个如何使用 like 连接的示例,以及一些示例数据。 我不得不转义下划线,因为这已经是 like 的特殊字符了。

    这个想法是匹配以'_'开头并以'_'或'.'结尾的字符串

    我没有过滤前缀,最后是一个微不足道的AND LIKE。

    CREATE TABLE t1(id int identity, val varchar(50))
    
    CREATE TABLE t2(id int identity, t1_id varchar(50))
    
    INSERT INTO t1(val)
    VALUES('1'),('2'),('3')
    
    INSERT INTO t2(t1_id)
    VALUES('a_1_x'),('b_2.'),('c_d'),('c_3.abc')
    
    SELECT 
    t1.id,
    t2.t1_id
    
    FROM t1
    INNER JOIN t2
        ON t2.t1_id LIKE '%[_]' + CAST(t1.id AS varchar(50)) + '[.|_]%'
    

    https://rextester.com/ZGJIG68078

    【讨论】:

    • 您可以更改like 模式以包含'DJ_' 前缀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2017-04-13
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多