我有MSSQL server 2008 R2 Enterprise。
我在这个表中有一个名为COUNTIF
的表,我有一个名为Blah
的列。
当我查询列时,我得到以下字符串: -
Somethings
以上所有都是可变长度,但都包含在括号中。 我的问题是,是否可以重新排列字符串,以便将括号内的文本移到开头?: -
something (something in brackets) somethingelse
somethingtasty (something in brackets again)
(something in brackets again and again)anothersomething
我已尝试使用(something in brackets)something somethingelse
(something in brackets again)somethingtasty
(something in brackets again and again)anothersomething
,substring
等,但我没有快速到达请帮助,谢谢
答案 0 :(得分:0)
我重新创建了你的情况并称之为“Somethings”字段。这是我用来获得所需输出的代码。假设您在字符串中有一组括号:
SELECT SUBSTRING(Somethings,CHARINDEX('(',Somethings),CHARINDEX(')',Somethings)-CHARINDEX('(',Somethings)+1) + REPLACE(Somethings,SUBSTRING([Somethings],CHARINDEX('(',Somethings),CHARINDEX(')',Somethings)-CHARINDEX('(',Somethings)+1),'')
FROM TABLE1
答案 1 :(得分:0)
我会质疑在数据库层中执行此类型字符串操作的逻辑。
但是,你可以做到
select
SUBSTRING(value,charindex('(',value)-1,charindex(')',value) +2 -charindex('(',value)) + -- In ( )
SUBSTRING(value,1,charindex('(',value)-1) + -- Left of ()
SUBSTRING(value,charindex(')',value)+1,99999), -- Right of ()
value
from
(
select 'something (something in brackets) somethingelse' as value
union
select 'somethingtasty (something in brackets again)' as value
union
select '(something in brackets again and again)anothersomething' as value
) dummy
如果你需要做更多的字符串提取和重新排列,可以使用CRL程序集?这个问题中的数据样本对我来说就像它可能会变得更复杂,例如a)没有(有((嵌套()的等等。
网站结论
通过本博文中的测试和测量,我们可以找到 当我们需要用小元素分割相对较小的字符串时 count(< 100个元素)然后T-SQL解决方案是最快的 并且无与伦比。
当我们在字符串中有适量的元素数量(大约100) 那么我们是否使用T-SQL或CLR-RegEx解决方案并不重要。
一旦字符串中元素的数量增加(超过100) 然后CLR-RegEx开始变得无与伦比且具有很高的数量 元素(超过1000,甚至数百万个元素)然后是T-SQL 解决方案几乎无法使用,因为我们可以看到10 000行的结果 每个1333个元素--T-SQL版本需要46分钟,而 CLR-RegEx仅用了1分钟。
同样在所有测试期间,都没有发生AppDomain 使用时操作大字符串时重新启动/(卸载/加载) CLR-RegEx解决方案。在我发现的一些博客上,有一些博客 AppDomain在使用CLR时卸载和加载但组合使用 String.Split方法。 RegEx解决方案没有这样的问题。
答案 2 :(得分:0)
所以涉及几个步骤。第一步是创建3个子串。一个捕获(),1捕获之前的所有内容,一个捕获之后的所有内容。
所以最终答案如下:
SELECT ID,(SUBSTRING(Somethings,CHARINDEX('(',Somethings),(CHARINDEX(')', Somethings)-CHARINDEX('(',Somethings)+1)) + SPACE (1) + SUBSTRING(Somethings,1,CHARINDEX('(',Somethings)-1) + SUBSTRING(Somethings,CHARINDEX(')',Somethings)+1,LEN(Somethings))
FROM Blah
第一个子字符串是:
SUBSTRING(Somethings,CHARINDEX('(',Somethings),(CHARINDEX(')', Somethings)-CHARINDEX('(',Somethings)+1))
它只是将字符串包含在'('和')'之间。通过使用charindex来确定开始和停止位置。
下一个也很简单:
SUBSTRING(Somethings,1,CHARINDEX('(',Somethings)-1)
从第一个角色开始,在'之前结束('
最后一个:
SUBSTRING(Somethings,CHARINDEX(')',Somethings)+1,LEN(Somethings))
在')之后立即开始。并以字符串的长度结束。
希望这有帮助。
答案 3 :(得分:0)
这里有另一个查询,使用left,right和substring。 这假设在字符串中有一个开口后跟一个右括号,否则会失败。
select substring(s, charindex('(', s), charindex(')', s) - charindex('(', s)+1)
+ left(s, charindex('(', s)-1)
+ right(s, len(s) - charindex(')', s))
from smt
请参阅demo here
答案 4 :(得分:0)
感谢所有帮助,最好的解决方案是
vagrant
最后有一个支架丢失,我也收到以下错误消息: - 传递给LEFT或SUBSTRING函数的长度参数无效
这是因为函数因为缺少空间而失败,这意味着它正在寻找长度为-1的子串,所以我在左侧部分添加了ABS()函数,它现在可以正常工作。
select substring(s, charindex('(', s), charindex(')', s) - charindex('(', s)+1)
+ left(s, charindex('(', s)-1)
+ right(s, len(s) - charindex(')', s))
from smt
再次感谢非常感谢所有的帮助。