我需要和最后6个字符串符号的字符码。我可以通过C#将最后6个字符相加如下:
string str = "helloWorld";
var sumLastSixCharacters = str.Where((ch, i) => (i > 3) ).Sum(x => x); //631我编写了以下代码来总结最后6个字符,但在我看来,应该有更优雅的解决方案:
DECLARE @Foo VARCHAR(10);
SET @Foo='helloWorld';
SELECT
CASE WHEN TRY_CONVERT(BIGINT, @Foo) IS NULL
THEN ASCII(SUBSTRING(@Foo, 5,1)) + ASCII(SUBSTRING(@Foo, 6,1)) +
ASCII(SUBSTRING(@Foo, 7,1)) + ASCII(SUBSTRING(@Foo, 8,1)) +
ASCII(SUBSTRING(@Foo, 9,1)) + ASCII(SUBSTRING(@Foo, 10,1))
ELSE 'Cast succeeded'
END AS Result; 伙计们,有没有人知道我能用更好的方法计算最后6个字符的总和?
发布于 2018-04-19 09:51:23
您可以对反向字符串使用递归CTE。
DECLARE @str VARCHAR(100)='helloWorld';
WITH recCTE AS
(
SELECT REVERSE(@str) AS OriginalReversed
,1 AS Position
,SUBSTRING(REVERSE(@str),1,1) AS CharAtPos
UNION ALL
SELECT r.OriginalReversed
,r.Position +1
,SUBSTRING(r.OriginalReversed,r.Position+1,1)
FROM recCTE AS r
WHERE Position<6 --specify the character count here
)
/*
--Use this to see the intermediate result
SELECT *
FROM recCTE
*/
SELECT SUM(ASCII(CharAtPos)) --631
FROM recCTE;一些解释
CTE将接受反向输入,启动一个1并接受第一个字符(从末尾)。
然后,它向下迭代,增加一个位置来读取下一个字符。
这样您就可以将test转换为
t
s
e
t对SUM值使用ASCII是所需的结果
更新
总结ASCII-值可能是个坏主意.任何字符相同的单词都会导致同样的结果.
如果您只需要从字符串中提取一个数字,您可以使用以下方法:
DECLARE @str VARCHAR(100)='helloWorld';
SELECT CAST(CAST(RIGHT(@str,6) AS BINARY(6)) AS BIGINT)这将只获取6个字节的二进制块,并将其解释为BIGINT
发布于 2021-07-16 14:18:33
这样就行了。我修改了它来解决原来的问题。
对我来说,我需要一个函数来计算连在一起的字段,以找到模式的重复,比如: abc \ cba和cba _cba\ abc
现在我可以找到这些实例并将其中一个替换为另一个实例,所以现在我只需要使用abc \ cba
用选择的database_of_your_choice.dbo.CREATE_STRING_CHECKSUM('yourstringhere')调用它
--以下代码
use database_of_your_choice
go
CREATE FUNCTION dbo.CREATE_STRING_CHECKSUM
(
@string nvarchar(100) = NULL
)
RETURNS int
AS
BEGIN
DECLARE @pos int = 0,
@len int = len(@string),
@ascii_sum int = 0,
@iter_count int = 6
--just in case you pass a string with less than 6 characters
if(@iter_count > @len) set @iter_count=@len
--loops for @iter_count: 6 times
while @iter_count > 0 begin
--passing @len to SUBSTRING will look at the right-most char decremented
--with each iteration: get the right most 6 characters
set @ascii_sum += ASCII(substring(@string,@len,1))
set @len -= 1
set @iter_count -= 1
end
-- Return the result of the function
RETURN @ascii_sum
END
GOhttps://stackoverflow.com/questions/49917792
复制相似问题