133

我有一个 sql 列,它是 100 个“Y”或“N”个字符的字符串。例如:

呸呸呸呸呸……

获取每行中所有“Y”符号的最简单方法是什么。

4

17 回答 17

372

此片段适用于您有布尔值的特定情况:它回答“有多少非 N?”。

SELECT LEN(REPLACE(col, 'N', ''))

如果在不同的情况下,您实际上是在尝试计算任何给定字符串中某个字符(例如“Y”)的出现次数,请使用以下命令:

SELECT LEN(col) - LEN(REPLACE(col, 'Y', ''))
于 2009-12-07T14:58:21.490 回答
105

在 SQL Server 中:

SELECT LEN(REPLACE(myColumn, 'N', '')) 
FROM ...
于 2009-12-07T14:57:48.603 回答
25

这给了我每次准确的结果......

这是在我的条纹领域...

黄色, 黄色, 黄色, 黄色, 黄色, 黄色, 黑色, 黄色, 黄色, 红色, 黄色, 黄色, 黄色, 黑色

  • 11 黄色
  • 2 黑色
  • 1 红色
SELECT (LEN(Stripes) - LEN(REPLACE(Stripes, 'Red', ''))) / LEN('Red') 
  FROM t_Contacts
于 2012-11-16T00:30:19.937 回答
13
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]
于 2014-02-17T13:54:41.800 回答
7

这将返回 N 的出现次数

select ColumnName, LEN(ColumnName)- LEN(REPLACE(ColumnName, 'N', '')) from Table

于 2019-08-27T11:57:40.647 回答
3

最简单的方法是使用 Oracle 函数:

SELECT REGEXP_COUNT(COLUMN_NAME,'CONDITION') FROM TABLE_NAME
于 2016-04-27T10:42:34.650 回答
2

也许像这样的东西......

SELECT
    LEN(REPLACE(ColumnName, 'N', '')) as NumberOfYs
FROM
    SomeTable
于 2009-12-07T14:58:19.743 回答
1

下面的解决方案有助于从有限制的字符串中找出不存在的字符:

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
于 2019-03-20T09:43:50.413 回答
0

试试这个

declare @v varchar(250) = 'test.a,1  ;hheuw-20;'
-- LF   ;
select len(replace(@v,';','11'))-len(@v)
于 2015-11-10T10:06:31.700 回答
0

试试这个:

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);

它确定单个字符出现的次数以及主字符串中的子字符串出现次数。

于 2016-07-11T12:57:02.517 回答
0

如果您想计算包含多个字符的字符串实例的数量,您可以使用以前的正则表达式解决方案,或者此解决方案使用 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
于 2016-09-09T17:24:49.577 回答
0

nickf 提供的第二个答案非常聪明。但是,它仅适用于目标子字符串的字符长度为 1 并且忽略空格。具体来说,我的数据中有两个前导空格,当右侧的所有字符都被删除时,SQL 会帮助删除(我不知道这一点)。这意味着

“ 约翰·史密斯”

使用 Nickf 的方法生成 12,而:

“乔·布洛格斯,约翰·史密斯”

生成 10,和

“乔·布洛格斯、约翰·史密斯、约翰·史密斯”

生成 20。

因此,我将解决方案稍微修改为以下内容,这对我有用:

Select (len(replace(Sales_Reps,' ',''))- len(replace((replace(Sales_Reps, ' ','')),'JohnSmith','')))/9 as Count_JS

我相信有人可以想到更好的方法!

于 2016-10-14T17:26:01.603 回答
0

你也可以试试这个

-- 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

输出:

在此处输入图像描述

于 2017-04-20T11:51:52.117 回答
0

如果您需要计算具有 2 种以上字符的字符串中的字符,则可以使用字符的'n' -某些运算符或正则表达式来代替您需要的字符。

SELECT LEN(REPLACE(col, 'N', ''))
于 2019-05-02T06:06:07.560 回答
-1

这是我在 Oracle SQL 中用来查看是否有人传递了格式正确的电话号码的内容:

WHERE REPLACE(TRANSLATE('555-555-1212','0123456789-','00000000000'),'0','') IS NULL AND
LENGTH(REPLACE(TRANSLATE('555-555-1212','0123456789','0000000000'),'0','')) = 2

第一部分检查电话号码是否只有数字和连字符,第二部分检查电话号码是否只有两个连字符。

于 2015-02-05T20:39:12.677 回答
-1

例如,计算 SQL Column ->name 中字符 (a) 的计数实例是列名 '' (并且在 doblequote 中为空,我将 a 替换为 nocharecter @'')

从 TESTING 中选择 len(name)- len(replace(name,'a',''))

选择 len('YYNYNYYNNNYYNY')- len(replace('YYNYNYYNNNYYNY','y',''))

于 2017-10-11T12:33:18.537 回答
-1
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;
于 2022-01-15T05:28:40.467 回答