首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在where子句中替换SQL server

问在where子句中替换SQL server
EN

Stack Overflow用户
提问于 2016-06-26 05:23:03
回答 2查看 2.2K关注 0票数 0

假设我们有一张桌子。此表为每个学生代码都有一个列(varchar)。我想根据我设置的过滤器搜索许多学生。

例如,我得到了一个问题字段(Varchar),用户可以在其中插入用逗号分隔的代码,比如000012,000014,000058。

问题字段返回的值与'000012,000014,000058'查询以Select * from Students where code in ( '000012,000014,000058')方式实现问题字段的值类似

我必须将值更改为:('000012','000014','000058'),所以使用替换函数REPLACE(CHAR(39)+'000012,000014,000058'+CHAR(39),',',CHAR(39)+','+CHAR(39)),我尝试使用这个函数

代码语言:javascript
复制
Select * 
from students 
where code in (REPLACE(CHAR(39)+'000012,000014,000058'+CHAR(39),',',CHAR(39)+','+CHAR(39)))

但还是不起作用。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-06-26 06:58:03

您的REPLACE(...返回一个字符串,您需要的是类似于表的东西。有很多方法可以将字符串(varchar)拆分到表中。这只是其中之一。

代码语言:javascript
复制
declare @ids varchar(100)='000012,000014,000058'
declare @x xml='<x>'+replace(@ids,',','</x><x>')+'</x>'
select * from students
where code in (
select t.x.value('.[1]','varchar(10)')
from @x.nodes('x') t(x)
)
票数 1
EN

Stack Overflow用户

发布于 2016-06-26 07:23:59

正如jpw所说,在单元格中使用逗号分隔的值违反了第一范式,因此SQL的查询能力已经被削弱。在这种情况下,您可以做的是首先恢复到正常形式,然后继续正常操作:

如果您使用的是SQL Server2016,则可以使用带有cross apply的string_split将单元格拆分为行(here's a backwards compatible string_split for earlier versions),例如:

代码语言:javascript
复制
select s.* from students s cross apply string_split(code, ',')
where value in ('000012','000014','000058')

..alternatively如果你没有2016,也不想添加string_split函数,你可以使用.nodes,就像亚历克斯的答案一样:

代码语言:javascript
复制
select s.* from students s cross apply
(select convert(xml, '<x>' + replace(code, ',', '</x><x>') + '</x>')) a(code_xml)
cross apply code_xml.nodes('*') x(n)
where n.value('.','varchar(20)') in ('000012','000014','000058')

-编辑

刚刚注意到您在注释中声明数据库单元格不包括逗号分隔值-在这种情况下,Alex的答案是合适的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38033093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档