Tsql T-SQL子字符串()行为
在我读过的书中,我遇到了一些代码,这些代码让我质疑了Tsql T-SQL子字符串()行为,tsql,substring,Tsql,Substring,在我读过的书中,我遇到了一些代码,这些代码让我质疑了SUBSTRING()函数的行为。代码应该搜索NYSIIS替换表(语音编码示例),并根据表中的位置“End”“Mid”或“Start”替换输入字符串的中间“N-gram”。摘录如下: NYSIIS替换表: Location NGram Replacement Mid A A Mid AW AA Mid E A Mid EV AF Mid EW AA Mid
SUBSTRING()
函数的行为。代码应该搜索NYSIIS替换表(语音编码示例),并根据表中的位置“End”“Mid”或“Start”替换输入字符串的中间“N-gram”。摘录如下:
NYSIIS替换表:
Location NGram Replacement
Mid A A
Mid AW AA
Mid E A
Mid EV AF
Mid EW AA
Mid I A
更换NGram的位置
中段
美国中部
中东
中电动汽车自动对焦
西南偏中AA
中段
使用[AdventureWorks]
声明@Result NVARCHAR(100)=N'NEVADA';
宣布更换NVARCHAR(10);
声明@i INT;
设置@i=1;
而@iorderby
子句使用模式的长度并按降序排序,因此最长匹配将首先出现。TOP
子句将结果限制在第一行。删除ORDER BY
子句会使结果不可预测
COALESCE
用于将@Replacement
设置为替换模式,或者设置@Result
字符串中@i
位置的字符(如果未找到模式匹配)。这是有意义的。谢谢我假设没有TOP或orderby的结果是无序的,尽管每次运行时我只返回2个字母的字符串。
USE [AdventureWorks]
DECLARE @Result NVARCHAR(100) = N'NEVADA';
DECLARE @Replacement NVARCHAR(10);
DECLARE @i INT;
SET @i = 1;
WHILE @i <= LEN (@Result)
BEGIN
SET @Replacement = NULL;
-- Grab the middle-of-name replacement n-gram
SELECT TOP(1) @Replacement = Replacement
FROM dbo.NYSIIS_Replacements
WHERE Location = N'Mid'
AND SUBSTRING(@Result, @i, LEN(NGram)) = NGram
ORDER BY LEN(NGram) DESC;
SET @Replacement = COALESCE(@Replacement, SUBSTRING(@Result, @i, 1));
-- If we found a replacement, apply it
SET @Result = STUFF(@Result, @i, LEN(@Replacement), @Replacement)
-- Move on to the next n-gram
SET @i = @i + COALESCE(LEN(@Replacement), 1);
END;
SELECT @Result;