Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果字符串存在于另一个表中,Sql将替换该字符串中的元音_Sql_Tsql - Fatal编程技术网

如果字符串存在于另一个表中,Sql将替换该字符串中的元音

如果字符串存在于另一个表中,Sql将替换该字符串中的元音,sql,tsql,Sql,Tsql,我有一个包含特定单词的表格 现在,当我插入一篇新文章时,我想在插入之前替换单词表包含的字符串中的元音。这就是为什么我需要使用触发器函数with而不是insert。 到目前为止,我已经做到了: Create TRIGGER trChangeAbusiveWord ON Post INSTEAD OF INSERT AS BEGIN Declare @abusiveWord nvarchar(max) Declare @correctedWord nvarchar(max) Select @ab

我有一个包含特定单词的表格

现在,当我插入一篇新文章时,我想在插入之前替换单词表包含的字符串中的元音。这就是为什么我需要使用触发器函数with而不是insert。 到目前为止,我已经做到了:

Create TRIGGER trChangeAbusiveWord
ON Post
INSTEAD OF INSERT
AS
BEGIN

Declare @abusiveWord nvarchar(max)
Declare @correctedWord nvarchar(max)

Select @abusiveWord = b.Woord FROM Scheldwoorden b WHERE exists 
    (select Message FROM inserted a where a.Message like '%' + b.Woord + '%')


Select @correctedWord = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@abusiveWord, 'A', '*'), 'E', '*'), 'O', '*'), 'U', '*'), 'I', '*')

Select Replace(Message, @abusiveWord, @correctedWord) FROM Message b
When done changed words, insert query here.

END
现在,当我插入此消息时:

INSERT into Post(Id_User, Id_Topic, Titel, Message) VALUES (7,1, 'TriggerMe', 'Hi im bear and I want to cook a nice meal')
我想把信息改成“嗨,我是b-r,我想c-k一个漂亮的m-l”

但根据我目前的查询结果,它只改变了第一个词:


“嗨,我是b**r,我想做一顿美餐”

使用替换内置功能:

  DECLARE @String VARCHAR(100) = 'Hi im bear and I want to cook a nice meal'

  SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,'A','-
            '),'E','-'),'I','-'),'O','-'),'U','-')
使用以下查询仅对给定值进行字符串替换:

DECLARE @String VARCHAR(100) = 'Hi im bear and I want to cook a nice meal'

DECLARE @Word1 VARCHAR(100) = 'bear'
DECLARE @Word2 VARCHAR(100) = 'meal'
DECLARE @Word3 VARCHAR(100) = 'cook'

DECLARE @ReplaceWord1 VARCHAR(100) = ''
DECLARE @ReplaceWord2 VARCHAR(100) = ''
DECLARE @ReplaceWord3 VARCHAR(100) = ''

SELECT @ReplaceWord1 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Word1, 'A', 
       '*'), 'E', '*'), 'O', '*'), 'U', '*'), 'I', '*')
SELECT @ReplaceWord2 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Word2, 'A', 
       '*'), 'E', '*'), 'O', '*'), 'U', '*'), 'I', '*')
SELECT @ReplaceWord3 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Word3, 'A', 
       '*'), 'E', '*'), 'O', '*'), 'U', '*'), 'I', '*')

SELECT REPLACE(REPLACE(REPLACE(@String, @Word1, @ReplaceWord1), @Word2, 
       @ReplaceWord2), @Word3, @ReplaceWord3)
对于替换多个单词:

DECLARE @String VARCHAR(100) = 'Hi im bear and I want to cook a nice meal'

DECLARE @ReplaceWords TABLE ( OrgWord VARCHAR(100) , ReplaceWord 
       VARCHAR(100) , Flag TINYINT DEFAULT(0) )
DECLARE @OrgWord VARCHAR(100) = ''
DECLARE @ReplaceWord VARCHAR(100) = ''

INSERT INTO @ReplaceWords ( OrgWord )
SELECT 'bear' UNION ALL
SELECT 'meal' UNION ALL
SELECT 'cook' 

UPDATE @ReplaceWords SET ReplaceWord = 
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(OrgWord, 'A', '*'), 'E', 
       '*'), 'O', '*'), 'U', '*'), 'I', '*')

WHILE EXISTS(SELECT 1 FROM @ReplaceWords WHERE Flag = 0)
BEGIN

    SELECT TOP 1 @OrgWord = OrgWord , @ReplaceWord = ReplaceWord 
    FROM @ReplaceWords WHERE Flag = 0

    SET @String = REPLACE(@String, @OrgWord, @ReplaceWord)

   UPDATE @ReplaceWords SET Flag = 1 WHERE OrgWord = @OrgWord

 END

 SELECT @String

您可以在包含单词的表上执行和更新操作,并通过替换表中所有单词的元音来设置实际字符串

DECLARE @String VARCHAR(100) = 'Hi im bear and I want to cook a nice meal'

DECLARE @AbusiveWords TABLE(ID INT,Word VARCHAR(10))
INSERT INTO @AbusiveWords (ID,Word) values (1,'bear'),(2,'cook'),(3,'meal')

UPDATE @AbusiveWords
SET @String=REPLACE(@String,Word,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Word,'A','-'),'E','-'),'I','-'),'O','-'),'U','-')) 
PRINT(@string);
输出:


如果我理解正确,这就是你正在尝试的。1.Scheldwoorden是一个包含特定单词列表的表。2.inserted是包含整个字符串Hi im bear的表,我想做一顿美味的饭,因此下面的select查询只返回一条记录到变量@abusiveWord select@abusiveWord=b.Woord FROM Scheldwoorden b(存在于其中)select Inhoud FROM inserted a WHERE a.Inhoud(类似“%”+b.Woord+”),因此它只替换单词当它被存储到变量中时,请记住。@Joby是的,这是正确的,但我不能让它处理多个单词字符串操作真的不是SQL的强项-我怀疑这在代码中会更容易完成。您可以使用xml.path命令做一些奇怪的事情-例如使用空格作为分隔符将字符串拆分成一个单词表,通过连接到Scheldwoorden表来更新表,然后使用FOR-XML循环将表连接回字符串。这会很可怕,而且速度很慢。。。这会改变整个句子的所有元音,而不仅仅是与另一个句子中的单词相匹配的单词table@Jeffreydww,其他表格有什么样的词。指定任何样本好吧,就像在示例中,我有消息“Hi im bear and I want cook a meat”,现在在其他表格中,我得到了单词bear、mean和cook。所以在这个句子中,我只想改变这些特定单词的元音。单词bear必须变成b-r,然后我们在表格列表中还有单词cook,所以单词必须变成c-k,当所有匹配的单词都被更改时,我想得到一句话:“嗨,我是b-r,我要c-k a m-l”@Jeffreydww,我根据你的命令更新了我的答案。现在检查一下。@Mansoor这会起作用,但是如果表格有100条记录,您将使用200个变量??在表中添加每个新词的代码后,您将不得不更改查询。这对我很有帮助,只需做一些小的修改,我就得到了我想要的!
Hi im b--r and I want to c--k a nice m--l