【问题标题】:SQL: Replace ID in StringSQL:替换字符串中的 ID
【发布时间】:2012-02-18 02:14:03
【问题描述】:

这是场景--

我有两个表格名称和句子:

Names                   Sentences
ID | Names              ID | Description                   
1  | Fox                1  | The <1> jumped over the <2>
2  | Narwhal            2  | The <2> sailed to the <3>
3  | Moon

我需要返回 Sentences 表中的所有描述,并将 ID 替换为 Names 表中的相应名称,例如

'狐狸跳过独角鲸','独角鲸航行到月球'。

我不知道从哪里开始,理论上它看起来像一个简单的问题,但我对操作字符串的知识是有限的。

任何帮助将不胜感激!

谢谢。

【问题讨论】:

  • 顺便说一句,这听起来不像是您可以使用 SQL 查询处理的问题。最好在代码中处理。
  • 我不知道如何使用 ANSI SQL 以动态方式解决这个问题,但看看REPLACE 命令,可能会对您有所帮助。
  • 我希望有一个解决方案,例如 - SELECT REPLACE(SENTENCES.DESCRIPTION, [SQL query to identify id/s in ], NAMES.NAMES)。或者达到那个效果。 EDIT Ortang 在我之前就进来了,谢谢,我得调查一下是否可行。
  • @ephron - 可行但不漂亮。如果只有一组替换,那将非常简单。请参阅下面的答案。

标签: sql string sql-server-2008 replace


【解决方案1】:

这至少应该让你开始。这样做很麻烦,因为您有多个级别的替换,并且数据本身没有 JOIN 键。

这使用了两个CROSS JOINs 和一堆字符串函数,所以会非常低效。这永远不会在大型数据集上快速运行。

DECLARE @names table (id int, names varchar(100))
DECLARE @sent table (id int, descr varchar(1000))

INSERT INTO @names
VALUES
(1, 'Fox'),
(2, 'Narwhal'),
(3, 'Moon')

INSERT INTO @sent 
VALUES
(1, 'The <1> jumped over the <2>.'),
(2, 'The <2> sailed to the <3>.')

SELECT DISTINCT Filtered
FROM (SELECT Replace(REPLACE(descr, '<' + CAST(n.id as varchar) + '>', n.names), '<' + CAST(n2.id as varchar) + '>', n2.names) Filtered
      FROM @sent s, @names n, @names n2) x
WHERE Filtered NOT LIKE '%<%'

【讨论】:

  • 感谢 JNK,幸运的是,它是在工作中一次性使用的,不会在大量数据上执行。
【解决方案2】:

您可以编写一个函数,然后使用该函数进行选择。但是,正如 JNK 所说,我不确定如何用两个替换来做到这一点。我的问题和回复 (SQL Server change font in html string) 给出了一个使用函数将一个字符串替换为另一个字符串的示例。您实际上是将“”替换为选择集,然后将“”替换为第一个集合的每个选择集。

【讨论】:

    【解决方案3】:

    另一种可能更快但会烧伤视网膜的方法:

    SELECT
    LEFT(Description, CHARINDEX('<', Description)-1)
    + Name1
    + SUBSTRING(Description, CHARINDEX('>', Description) + 1, CHARINDEX('<', Description, CHARINDEX('<', Description) + 1) - CHARINDEX('>', Description) - 1)
    + Name2
    FROM Sentences
    JOIN Names AS Name1 ON Name1.ID = CAST(SUBSTRING(Description, CHARINDEX('<', Description) + 1, 1) AS INT)
    JOIN Names AS Name2 ON Name2.ID = CAST(SUBSTRING(Description, CHARINDEX('<', Description, CHARINDEX('<', Description) + 1) + 1, 1) AS INT)
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2011-04-03
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多