【问题标题】:SQL Server Compare data and replaced togetherSQL Server 比较数据并一起替换
【发布时间】:2015-12-22 05:48:06
【问题描述】:

我有两个字符串如下:

 ***ABCABCABCABCABC***
 BBBTTTTTTTTTTTTTTTCCC

我只想从字符串下面替换 * 位置

所以结果可能是:

 BBBABCABCABCABCABCCCC
 BBBTTTTTTTTTTTTTTTCCC

有什么方法可以优雅地解决使用 SQL Server 函数的问题吗?

我已经在下面使用了。

 DECLARE @Value1=PATINDEX('%[A,C,G,T]%', '***ABCABCABCABCABC***')
 Select SUBSTRING('BBBTTTTTTTTTTTTTTTBBB', 0, @Value1)
 ....

但如果其他情况,这需要很多。

我想知道有没有简单的方法可以替换它。

【问题讨论】:

  • 不,没有优雅的解决方案。有解决方案,但我想不出任何可以被认为是“优雅”的东西。

标签: sql sql-server design-patterns substring patindex


【解决方案1】:

你可以使用:

DEMO

DECLARE
   @String1 NVARCHAR(100) = '***ABCABCABCABCABC***',
   @String2 NVARCHAR(100) = 'BBBTTTTTTTTTTTTTTTCCC';

DECLARE @new_string NVARCHAR(100) = NULL;

;WITH nums AS
(
  SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY t1.number) AS N
  FROM master..spt_values t1 
  CROSS JOIN master..spt_values t2
), string_1 AS
(
  SELECT N, letter
  FROM nums
  CROSS APPLY (SELECT SUBSTRING(@String1, nums.N, 1) WHERE nums.N <= LEN(@String1)) 
    AS t(letter)
), string_2 AS
(
  SELECT N, letter
  FROM nums
  CROSS APPLY (SELECT SUBSTRING(@String2, nums.N, 1) WHERE nums.N <= LEN(@String2)) 
   AS t(letter)
), new_string AS
(
  SELECT Letter = CASE WHEN s1.Letter <> '*' THEN s1.Letter ELSE s2.Letter END,
         s1.N
  FROM string_1 s1
  LEFT JOIN string_2 s2
    ON s1.N = s2.N
)
SELECT @new_string = (SELECT '' + ISNULL(Letter, '')
                      FROM new_string
                      ORDER BY N ASC
                      FOR XML PATH(''));
                            
SELECT @new_string
UNION ALL
SELECT @String2;
  1. 生成数字(你可以使用任何方法)

  2. 用字母分割字符串一和二

  3. 生成新字符串,将*替换为对应的字母

  4. 将字母组合在一起

备注:您可以将所有这些组合到一个查询中,但为了便于阅读,我将其拆分。

随意包装它以使其优雅

[dbo].[udf_merge_string](@string NVARCHAR(100), @string2 NVARCHAR(100)) ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2015-12-28
    • 2011-08-31
    • 2013-10-05
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多