我有一个 sql 列,它是 100 个“Y”或“N”个字符的字符串。例如:
呸呸呸呸呸……
获取每行中所有“Y”符号的最简单方法是什么。
此片段适用于您有布尔值的特定情况:它回答“有多少非 N?”。
SELECT LEN(REPLACE(col, 'N', ''))
如果在不同的情况下,您实际上是在尝试计算任何给定字符串中某个字符(例如“Y”)的出现次数,请使用以下命令:
SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
在 SQL Server 中:
SELECT LEN(REPLACE(myColumn, 'N', ''))
FROM ...
这给了我每次准确的结果......
这是在我的条纹领域...
黄色, 黄色, 黄色, 黄色, 黄色, 黄色, 黑色, 黄色, 黄色, 红色, 黄色, 黄色, 黄色, 黑色
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red')
FROM t_Contacts
DECLARE @StringToFind VARCHAR(100) = "Text To Count"
SELECT (LEN([Field To Search]) - LEN(REPLACE([Field To Search],@StringToFind,'')))/COALESCE(NULLIF(LEN(@StringToFind), 0), 1) --protect division from zero
FROM [Table To Search]
这将返回 N 的出现次数
select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', ''))
from Table
最简单的方法是使用 Oracle 函数:
SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
也许像这样的东西......
SELECT
LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
SomeTable
下面的解决方案有助于从有限制的字符串中找出不存在的字符:
1) 使用 SELECT LEN(REPLACE(myColumn, 'N', '')),但在以下情况下存在限制和错误输出:
SELECT LEN(REPLACE('YYNYNYYNNNYYNY', 'N', ''));
--8 --正确选择 LEN(替换('123a123a12', 'a', ''));
--8 --错误选择 LEN(替换('123a123a12', '1', ''));
--7 --错误
2)尝试使用以下解决方案以获得正确的输出:
选择 dbo.vj_count_char_from_string('123a123a12','2');
--2 --正确选择 dbo.vj_count_char_from_string('123a123a12','a');
--2 --正确
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: VIKRAM JAIN
-- Create date: 20 MARCH 2019
-- Description: Count char from string
-- =============================================
create FUNCTION vj_count_char_from_string
(
@string nvarchar(500),
@find_char char(1)
)
RETURNS integer
AS
BEGIN
-- Declare the return variable here
DECLARE @total_char int; DECLARE @position INT;
SET @total_char=0; set @position = 1;
-- Add the T-SQL statements to compute the return value here
if LEN(@string)>0
BEGIN
WHILE @position <= LEN(@string) -1
BEGIN
if SUBSTRING(@string, @position, 1) = @find_char
BEGIN
SET @total_char+= 1;
END
SET @position+= 1;
END
END;
-- Return the result of the function
RETURN @total_char;
END
GO
试试这个
declare @v varchar(250) = 'test.a,1 ;hheuw-20;'
-- LF ;
select len(replace(@v,';','11'))-len(@v)
试试这个:
SELECT COUNT(DECODE(SUBSTR(UPPER(:main_string),rownum,LENGTH(:search_char)),UPPER(:search_char),1)) search_char_count
FROM DUAL
connect by rownum <= length(:main_string);
它确定单个字符出现的次数以及主字符串中的子字符串出现次数。
如果您想计算包含多个字符的字符串实例的数量,您可以使用以前的正则表达式解决方案,或者此解决方案使用 STRING_SPLIT,我相信它是在 SQL Server 2016 中引入的。您还需要兼容性130级以上。
ALTER DATABASE [database_name] SET COMPATIBILITY_LEVEL = 130
.
--some data
DECLARE @table TABLE (col varchar(500))
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverwhateverCHAR(10)'
INSERT INTO @table SELECT 'whaCHAR(10)teverCHAR(10)whateverCHAR(10)~'
--string to find
DECLARE @string varchar(100) = 'CHAR(10)'
--select
SELECT
col
, (SELECT COUNT(*) - 1 FROM STRING_SPLIT (REPLACE(REPLACE(col, '~', ''), 'CHAR(10)', '~'), '~')) AS 'NumberOfBreaks'
FROM @table
nickf 提供的第二个答案非常聪明。但是,它仅适用于目标子字符串的字符长度为 1 并且忽略空格。具体来说,我的数据中有两个前导空格,当右侧的所有字符都被删除时,SQL 会帮助删除(我不知道这一点)。这意味着
“ 约翰·史密斯”
使用 Nickf 的方法生成 12,而:
“乔·布洛格斯,约翰·史密斯”
生成 10,和
“乔·布洛格斯、约翰·史密斯、约翰·史密斯”
生成 20。
因此,我将解决方案稍微修改为以下内容,这对我有用:
Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS
我相信有人可以想到更好的方法!
你也可以试试这个
-- DECLARE field because your table type may be text
DECLARE @mmRxClaim nvarchar(MAX)
-- Getting Value from table
SELECT top (1) @mmRxClaim = mRxClaim FROM RxClaim WHERE rxclaimid_PK =362
-- Main String Value
SELECT @mmRxClaim AS MainStringValue
-- Count Multiple Character for this number of space will be number of character
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'GS', ' ')) AS CountMultipleCharacter
-- Count Single Character for this number of space will be one
SELECT LEN(@mmRxClaim) - LEN(REPLACE(@mmRxClaim, 'G', '')) AS CountSingleCharacter
输出:
如果您需要计算具有 2 种以上字符的字符串中的字符,则可以使用字符的'n' -
某些运算符或正则表达式来代替您需要的字符。
SELECT LEN(REPLACE(col, 'N', ''))
这是我在 Oracle SQL 中用来查看是否有人传递了格式正确的电话号码的内容:
WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2
第一部分检查电话号码是否只有数字和连字符,第二部分检查电话号码是否只有两个连字符。
例如,计算 SQL Column ->name 中字符 (a) 的计数实例是列名 '' (并且在 doblequote 中为空,我将 a 替换为 nocharecter @'')
从 TESTING 中选择 len(name)- len(replace(name,'a',''))
选择 len('YYNYNYYNNNYYNY')- len(replace('YYNYNYYNNNYYNY','y',''))
DECLARE @char NVARCHAR(50);
DECLARE @counter INT = 0;
DECLARE @i INT = 1;
DECLARE @search NVARCHAR(10) = 'Y'
SET @char = N'YYNYNYYNNNYYNY';
WHILE @i <= LEN(@char)
BEGIN
IF SUBSTRING(@char, @i, 1) = @search
SET @counter += 1;
SET @i += 1;
END;
SELECT @counter;