我試圖通過從預定義的一組可替換字符中獲取單個字符,并將其替換為類似于被替換字母的數字/特殊字符,從而部分地 'leet-ify' 一個單詞。我不想替換第一個字符。
早些時候,我得到一個單詞,我確保在可替換字母集中的第一個字母之后至少有一個字母,并將其放入@Word變數中。然后我使用以下內容替換一個字母。(以“可愛”為例)
DECLARE @Word varchar(8) = 'lovable';
DECLARE @ReplaceChar varchar(1);
SET @ReplaceChar = SUBSTRING(@Word,PATINDEX('[a-z][abeilost]',@Word) 1,1);
SET @ReplaceChar =
(SELECT CASE @ReplaceChar
WHEN 'a' THEN '@'
WHEN 'b' THEN '8'
WHEN 'e' THEN '3'
WHEN 'i' THEN '!'
WHEN 'l' THEN '1'
WHEN 'o' THEN '0'
WHEN 's' THEN '$'
WHEN 't' THEN ' '
END
);
SET @Word = STUFF(@Word,PATINDEX('[a-z][abeilost]',@Word) 1,1,@ReplaceChar);
據我了解,PATINDEX應該找到第一個任意字母后跟匹配字母字串的起始位置,并且SUBSTRING/STUFF在收集或替換之前顯式將該數字加 1,所以我永遠不應該得到“可愛”改為'1oveable'......但這就是我得到的。我錯過了什么?
澄清預期結果:
| 輸入 | 輸出 |
|---|---|
| 可愛的 | l0veable |
| 給 | g1ve |
| 庇護所 | 過濾器 |
| 克 | gr@ms |
| 弗里吉亞語 | 弗里甘 |
uj5u.com熱心網友回復:
在我們在上面的評論中討論之后,我建議這種方法:
DECLARE @Word varchar(8) = 'truth';
DECLARE @toBeReplaced VARCHAR(10)='abeilost';
DECLARE @replaceWith VARCHAR(10)='@83!10$ ';
DECLARE @position INT=PATINDEX(CONCAT('%[',@toBeReplaced,']%'),SUBSTRING(@word,2,8000)) 1;
SELECT STUFF(@word,@position,1,TRANSLATE(SUBSTRING(@word,@position,1),@toBeReplaced,@replaceWith));
簡而言之:
- 我們定義您的翻譯引數。
- 我們在第一個字符
PATINDEX()后面找到位置。 - 現在我們可以用
STUFF()它的翻譯來替換給定位置的一個字符。
下一次:如果您提供了一些具有預期結果的樣本,將會有很大幫助。
更新
在表格結果中使用它,您可以避免宣告的變數并行內執行此操作:
DECLARE @WordTable TABLE(SomeText varchar(8));
INSERT INTO @WordTable VALUES('truth'),('loveable');
DECLARE @toBeReplaced VARCHAR(10)='abeilost';
DECLARE @replaceWith VARCHAR(10)='@83!10$ ';
--新的查詢
SELECT STUFF(wt.SomeText,pos,1,TRANSLATE(SUBSTRING(wt.SomeText,pos,1),@toBeReplaced,@replaceWith))
FROM @WordTable wt
CROSS APPLY(SELECT PATINDEX(CONCAT('%[',@toBeReplaced,']%'),SUBSTRING(wt.SomeText,2,8000)) 1) A(pos);
uj5u.com熱心網友回復:
SELECT PATINDEX('[a-z][abeilost]', @Word)
正在回傳 0。根據檔案, 0 表示未找到。找不到它的原因是您的搜索條件僅適用于 2 個字符,第一個是匹配的單個字符,[a-z]第二個是匹配的單個字符[abeilost]。如果要允許更多字符,則需要擴展搜索運算式,例如
SELECT PATINDEX('[a-z][abeilost]%', @Word)
雖然我希望這不會像我想象的那樣做你想要的,但你想多次重復指定的字符,而PATINDEX.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466602.html
