在SQL中,如何在同一记录中找到重复的字符串值?

时间:2018-04-19 02:14:05

标签: sql

样本表

10

是否可以查询存在重复字符串值的所有记录?例如,我怎么能查询拉记录4的字符串" red"出现了两次?除了我正在处理的表格外,还有更多的字符串值可以填充在" filters_applied"柱。

澄清我正在使用Periscope并使用SQL提取数据。

4 个答案:

答案 0 :(得分:0)

我假设您必须在逻辑页面中检查它。 您可以使用类似'%red%'。

查询表格
  

从表格中选择Filters_Applied,其中Filters_Applied类似于'%red%';

您将获得至少有一个红色的数据。然后,在逻辑页面中进行一些字符串分析。

在php中,您可以使用substr_count函数来确定字符串的出现次数。

//the loop to load db query
while(){
  $number= substr_count("Filters_Applied",red); 
  if($number>1){
    echo "this".$Filters_Applied.">1"
   }
}

答案 1 :(得分:0)

用于SQL-SERVER或其他可以运行这些功能的版本

应用此逻辑

declare @val varchar(100) = 'yellow,blue,white,green'
DECLARE @find varchar(100) = 'green'

select @val = replace(@val,' ','') -- remove spaces

select @val;

select (len(@val)-len(replace(@val,@find,'')))/len(@find) [recurrence]

答案 2 :(得分:0)

创建此函数,它将字符串解析为行并编写查询,如下所示。这适用于SQL Server。

CREATE FUNCTION [dbo].[StrParse]
            (@delimiter CHAR(1),  
            @csv       NTEXT)  
RETURNS @tbl TABLE(Keys  NVARCHAR(255))  
AS  

BEGIN  
DECLARE  @len INT  
SET @len = Datalength(@csv)  
IF NOT @len > 0  
    RETURN  

DECLARE  @l INT  
DECLARE  @m INT  

SET @l = 0  
SET @m = 0  

DECLARE  @s VARCHAR(255)  
DECLARE  @slen INT  

WHILE @l <= @len  
    BEGIN  

    SET @l = @m + 1--current position  
    SET @m = Charindex(@delimiter,Substring(@csv,@l + 1,255))--next delimiter or 0  

    IF @m <> 0  
        SET @m = @m + @l  
    --insert @tbl(keys) values(@m)  
    SELECT @slen = CASE   
                        WHEN @m = 0 THEN 255 --returns the remainder of the string  
                        ELSE @m - @l  
                    END --returns number of characters up to next delimiter  

    IF @slen > 0  
        BEGIN  
        SET @s = Substring(@csv,@l,@slen)  
        INSERT INTO @tbl  
                    (Keys)  
        SELECT @s  
        END  

    SELECT @l = CASE   
                    WHEN @m = 0 THEN @len + 1 --breaks the loop  
                    ELSE @m + 1  
                END --sets current position to 1 after next delimiter  
    END  

RETURN  
END

GO

CREATE TABLE Table1# (RecordNumber int, [Filter] varchar(5), Filters_Applied varchar(100))
GO
INSERT INTO Table1# VALUES
(1,'yes','red, blue')
,(2,'yes','green')
,(3,'no ','') 
,(4,'yes','red, red, blue')

GO
--This query will return what you are expecting
SELECT t.RecordNumber,[Filter],Filters_Applied,ltrim(rtrim(keys)), count(*)NumberOfRows
FROM Table1# t
CROSS APPLY dbo.StrParse (',', t.Filters_Applied)
GROUP BY t.RecordNumber,[Filter],Filters_Applied,ltrim(rtrim(keys)) HAVING count(*) >1

答案 3 :(得分:0)

您没有说明您的DBMS,但在Postgres中,这并不复杂:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

<div onclick="swipeDislike()">
  click here
</div>

<div id="content">
  <div id="photo">
    DIV content photo
  </div>
</div>

在线示例:http://rextester.com/TJUGJ44586

select st.* from sample_table st join lateral ( select count(*) <> count(distinct trim(item)) as has_duplicates from unnest(string_to_array(filters_applied,',')) as t(item) ) x on true where x.has_duplicates; 外,上述内容实际上是标准SQL