【问题标题】:Check a substring is exist in string in sql server检查sql server中的字符串中是否存在子字符串
【发布时间】:2020-07-29 14:05:40
【问题描述】:

我在数据库中有一个包含这些值的列:

##1##,##7##,

##1##,##3##,##5##,

我需要检查##3##是否存在。

我尝试使用like子句

declare @MyCSharpParameter

set @MyCSharpParameter = '##3##,##4##'

select * from myTable where col like '%@MyCSharpParameter%'

但是,它不能正常工作,因为 myTable 没有 '##3##,##4##' 它有 ##3##,##5##,

任何帮助,请检查它作为单独的数字并找到 3。

【问题讨论】:

  • 我删除了不一致的数据库标签。请用您真正使用的数据库进行标记。然后,修复您的数据模型,这样您就不会在逗号分隔的字符串中存储多个值。这是一个 SQL 反模式。
  • 如果你想找到 "##3##' 为什么不把你的参数设置成这样set @MyCSharpParameter = '##3##'
  • @GordonLinoff 我正在处理旧项目,它已经像这样构建了。我无法更改数据模型。
  • @DiogoMagro 亲爱的,因为这些值来自 C# 中的多选,用户可以选择 3 和 4 我需要检查所选值中的至少一个值是否存在于 mytable 中。
  • @QaisAlmomany 好的.. 你检查 STRING_SPLIT 了吗?你可以用逗号分割你的 c# 参数,然后你把你的参数分开来检查你想要什么

标签: sql sql-server ado.net


【解决方案1】:

如果您使用的是 SQL Server 2016 或更高版本,这是使用string_split的一种方法

declare @MyCSharpParameter nvarchar(50);
set @MyCSharpParameter = '##3##,##4##';

create table t (col varchar(100));

insert into t 
values('##1##,##7##'),('##1##,##3##,##5##');

select *, case when b.value is not null then 'yes' else 'no' end as found
from t a 
left join string_split(@MyCSharpParameter, ',') as b on a.col like '%'+b.value+'%';

DEMO

【讨论】:

【解决方案2】:

您可以使用exists 子查询:

select t.*,
       (case when exists (select 1
                          from string_split(a.col, ',') s1 join
                               string_split(@MyCSharpParameter, ',') s2
                               on s1.value = s2.value
                         )
              then 'yes' else 'no'
        end)
from t;

如果有多个匹配项,这不会返回重复的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2011-01-31
    • 2011-07-30
    • 1970-01-01
    • 2013-12-13
    • 2013-04-29
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多