如何在字符串中查找特定字符并将其替换为从SQL Server中的表中获取的值

问题描述 投票:0回答:3

我将文本存储在“StructureStrings”表中

Create Table StructureStrings(Id INT Primary Key,String nvarchar(4000))

样本数据:

Id字符串 1从员工中选择*其中Id BETWEEN ###和###以及客户ID> ### 2从客户中选择* ID BETWEEN ###和### 3从部门中选择*其中Id = ###

我想用从另一个名为“StructureValues”的表中获取的值替换“###”单词

 Create Table StructureValues (Id INT Primary Key,Value nvarcrhar(255))
        Id Value 
        1  33
        2  20
        3  44

我想替换字符串中的“###”标记

      Select * from  Employee where Id BETWEEN 33 and 20 and Customer Id> 44
      Select * from  Customer where Id BETWEEN 33 and 20
      Select * from  Department where Id=33

PS:1。这里假设这些值将以相同的顺序替换为令牌,即“###”的第一次出现将被“StructureValues.Value”列的第一个值替换,依此类推。

sql-server database
3个回答
1
投票

将此作为新答案发布,而不是编辑我以前的答案。

这使用Jeff Moden's DelimitedSplit8K;它不使用SQL Server 2016中可用的内置拆分器,因为它不提供项目编号(因此没有连接标准)。

您需要首先将该功能放在您的服务器上,然后您就可以使用它了。不要指望它表现良好。这里有很多REPLACE,这将阻碍性能。

SELECT (SELECT REPLACE(DS.Item, '###', CONVERT(nvarchar(100), SV.[Value]))
        FROM StructureStrings sq
             CROSS APPLY DelimitedSplit8K (REPLACE(sq.String,'###','###|'), '|') DS --NOTE this uses a varchar, not an nvarchar, you may need to change this if you really have Unicode characters
             JOIN StructureValues SV ON DS.ItemNumber = SV.Id
        WHERE SS.Id = sq.id
        FOR XML PATH ('')) AS NewString
FROM StructureStrings SS;

如果您有任何疑问,请将评论放在这个答案上;不要把它们置于已经成为长期讨论的问题之下。


0
投票

也许这就是你要找的东西。

DECLARE @Employee TABLE (Id int)
DECLARE @StructureValues  TABLE (Id int, Value int)

INSERT INTO @Employee
VALUES (1), (2), (3), (10), (15), (20), (21)

INSERT INTO @StructureValues
VALUES (1, 10), (2, 20)

SELECT * 
FROM @Employee 
WHERE Id BETWEEN (SELECT MIN(Value) FROM @StructureValues) AND (SELECT MAX(Value) FROM @StructureValues)

0
投票

这里非常不同:

CREATE TABLE StructureStrings(Id int PRIMARY KEY,String nvarchar(4000));

INSERT INTO StructureStrings
VALUES (1,'SELECT * FROM Employee WHERE Id BETWEEN ### AND ###'),
       (2,'SELECT * FROM Customer WHERE Id BETWEEN ### AND ###');

CREATE TABLE StructureValues (Id int, [Value] int);
INSERT INTO StructureValues
VALUES (1,10),
       (2,20);
GO

DECLARE @SQL nvarchar(4000);
--I'm asuming that as you gave one output you are supplying an ID or something?
DECLARE @Id int = 1;

WITH CTE AS(
    SELECT SS.Id,
           SS.String,
           SV.[Value],
           LEAD([Value]) OVER (ORDER BY SV.Id) AS NextValue,
           STUFF(SS.String,PATINDEX('%###%',SS.String),3,CONVERT(varchar(10),[Value])) AS ReplacedString
    FROM StructureStrings SS
         JOIN StructureValues SV ON SS.Id = SV.Id)
SELECT @SQL = STUFF(ReplacedString,PATINDEX('%###%',ReplacedString),3,CONVERT(varchar(10),NextValue))
FROM CTE
WHERE Id = @Id;

PRINT @SQL;
--EXEC (@SQL); --yes, I should really be using sp_executesql

GO
DROP TABLE StructureValues;
DROP TABLE StructureStrings;

编辑:请注意,Id 2将返回NULL,因为LEAD没有值。如果需要改变,如果LEAD没有价值,我们需要更多关于价值应该是什么的逻辑。

编辑2:这是基于OP的原始帖子,而不是他后面提到的。目前看来,这是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.