Wil*_*l P 3 sql t-sql sql-server sql-server-2000
我从这开始,但它是执行任务的最佳方式吗?
select
reverse(
substring(reverse(some_field),
charindex('-', reverse(some_field)) + 1,
len(some_field) - charindex('-', reverse(some_field))))
from SomeTable
Run Code Online (Sandbox Code Playgroud)
reverse(some_field)?charindex
' - '并存储它的最后一个索引,是否有更有效的方法在T-SQL中执行此任务?请注意,我的工作,我真的很想知道它是否是最好的方式.
以下是some_field的一些示例值.
s2-st, s1-st, s3-st, s3-sss-zzz, s4-sss-zzzz
Run Code Online (Sandbox Code Playgroud)
编辑:
此示例输出将是......
s1, s2, s3-sss, s3, s4-sss
Run Code Online (Sandbox Code Playgroud)
ErikE编写的解决方案实际上是在字符串的结尾处,所以在最后一个连字符之后的所有内容.我只是修改了他的版本以获得它之前的所有内容,而不是使用与该left函数类似的方法.感谢您的所有帮助.
select left(some_field, abs(charindex('-', reverse(some_field)) - len(some_field)))
from (select 's2-st' as some_field
union select 's1-st'
union select 's3-st'
union select 's3-sss-zzz'
union select 's4-sss-zzzz') as SomeTable
Run Code Online (Sandbox Code Playgroud)
我可以建议你简化你的表达:
select right(some_field, charindex('-', reverse(some_field)) - 1)
from SomeTable
Run Code Online (Sandbox Code Playgroud)
另外,据我所知,当您需要其余的字符串时,使用子字符串函数指定长度为8000个字符也没有什么坏处.只要它不是varchar(max),它就可以正常工作.
如果这是你必须一直做的事情,一遍又一遍,#1如何将数据拆分成单独的列并以这种方式存储,或者#2添加一个带有索引的计算列,这将执行在更新/插入时计算一次,而不是稍后再计算.
最后,我不知道SQL Server是否足够聪明,只能反转(some_field)一次并将其注入另一个实例.当我得到一些时间,我会试着弄明白.
更新
哎呀,不知怎的,我倒退了你想要的东西.对于那个很抱歉.您展示的新表达式仍然可以简化一点:
select left(some_field, len(some_field) - charindex('-', reverse(some_field)))
from (
select 's2-st'
union all select 's1-st'
union all select 's3-st'
union all select 's3-sss-zzz'
union all select 's4-sss-zzzz'
union all select 's5'
) X (some_field)
Run Code Online (Sandbox Code Playgroud)
表达式中的abs()只是反转符号.所以我放了+ len - charindex而不是+ charindex - len现在一切都好.它甚至适用于没有破折号的字符串.
还有一件事要提到:你UNION SELECT应该是UNION ALL SELECT因为没有它ALL,引擎必须删除重复项,就像你指示的一样SELECT DISTINCT.只要养成使用习惯,ALL你就会好多了.:)