计算sql中字符的出现次数

时间:2013-01-29 12:55:30

标签: sql sql-server tsql

我正在尝试计算字符串中'*'的数量,但它给了我错误的计数

DECLARE @LongSentence VARCHAR(MAX)
DECLARE @FindSubString VARCHAR(MAX)
SET @LongSentence = 'Pravin Gaonkar: 29 Jan 2013 17:29:22 :  *'
SET @FindSubString = '*'
SELECT LEN(@LongSentence) - LEN(REPLACE(@LongSentence,@FindSubString,''))[Count]

输出

Count
3

原创 - 1但它给了我3个计数

数据库SQL SERVER 2008

2 个答案:

答案 0 :(得分:5)

您的查询存在的问题是,替换字符串上的*会使其以三个尾随空格结束,LEN不计算这些空格。因此,您的结果是3.尝试使用DATALENGTH

DECLARE @LongSentence VARCHAR(MAX)
DECLARE @FindSubString VARCHAR(MAX)
SET @LongSentence = 'Pravin Gaonkar: 29 Jan 2013 17:29:22 :  *'
SET @FindSubString = '*'

SELECT DATALENGTH(@LongSentence) - 
       DATALENGTH(REPLACE(@LongSentence,@FindSubString,''))[Count]

答案 1 :(得分:-2)

这是Oracle查询。我不确定您的SQL版本中是否可以使用LEVEL或ROWNUM代替LEVEL。但它仍然可以帮助你:

SELECT count(*) cnt FROM
(
 SELECT DISTINCT(Instr('Pravin Gaonkar: 29 Jan 2013 17:29:22 :  *', '*', LEVEL)) char_pos
   FROM dual
 CONNECT BY LEVEL <= Length('Pravin Gaonkar: 29 Jan 2013 17:29:22 :  *') 
)
WHERE char_pos > 0
/

SQL>

CNT
---
  1

SQL Server 2008 - 使用层次结构方法查询分层表(G​​etRoot和GetLevel ...) - 与我的示例中使用的Oracle层次结构等效:http://msdn.microsoft.com/en-us/library/3b4f7dae-65b5-4d8d-8641-87aba9aa692d(v=sql.100)