首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用IN将单个值与另一列中逗号分隔的字段进行比较

如何使用IN将单个值与另一列中逗号分隔的字段进行比较
EN

Database Administration用户
提问于 2019-09-17 19:43:36
回答 2查看 6K关注 0票数 0

我有张像这样的桌子。让我们称它为table1

代码语言:javascript
复制
|attributeMask |
|--------------|
| ,300,302,400 | 
| ,301,500     | 
| ,900,876     | 

这些是varchar值。

然后我有了另一个table2:

代码语言:javascript
复制
 columnNumber  | 
|------|
| 300  | 
| 500  | 
| 900  | 

这些都是整数。

我需要的是一个查询来比较columnNumberattributeMask中的值。

例如,我需要在attributeMask中找到具有300的行(对于每一行)。第二个columnNumber是500,我将将它与它自己的attributeMask (可以是,299,34,500)中的相应行进行比较)。我正在尝试使用FOR XML PATH或其他函数,但我不知道该做什么。

到目前为止,这是我可以创建的整个查询:

代码语言:javascript
复制
select  top 3  
    t1.[Name]
   ,t1.ColumnNumber
   ,t3.AttributeMask 
   ,t3.changeData 
   ,t3.CreatedOn
   ,t3.ObjectTypeCode
   ,t3.UserId
from metadataschema.attribute     t1
inner join  metadataschema.Entity t2
    on t1.EntityId=t2.EntityId
inner join AuditBase              t3
    on t2.ObjectTypeCode=t3.ObjectTypeCode
where t2.ObjectTypeCode=1 
//this is wrong. but is this part that I need to fix
and convert(varchar,t1.ColumnNumber) in (select t3.AttributeMask from 
AuditBase)
//until here
and t3.CreatedOn BETWEEN '20190902' AND '20190913' 
and t1.[Name] in
(
'address1_postalcode','smart_caixapostal','smart_tipologradouro','smart_complementoprincipal','smart_estado','smart_logradouroprincipal','smart_bairroprincipal',
'new_regiao','smart_numero','address1_city','smart_pais','smart_validarendereco','smart_cepcobranca','smart_caixacobranca','smart_validarendereco_cob',
'smart_tipologradourocobranca','smart_logradourocobranca','smart_numerocobranca','smart_complementocobranca','smart_bairrocobranca','smart_municipiocobranca',
'smart_estadocobranca','territoryid','smart_paiscobranca','smart_cepmkt','smart_logradouromkt','smart_complementomkt','smart_ufmkt','smart_tipodelogradouromkt',
'smart_bairromkt','smart_ddidddmkt','smart_caixapostalmkt','smart_numeromkt','smart_municipiomkt','smart_telefonemkt'
)
EN

回答 2

Database Administration用户

发布于 2019-09-17 21:29:21

有办法做到这一点。但是,我强烈建议您重新考虑在列中使用逗号分隔的值。如果您绝对必须这样做,则可以在通配符中使用LIKE运算符。这将使您能够在属性掩码字符串中搜索值。期待糟糕的表现时,查找许多价值。

代码语言:javascript
复制
inner join AuditBase              t3
    on t2.ObjectTypeCode=t3.ObjectTypeCode
    and t3.AttributeMask LIKE '%' + convert(varchar,t1.ColumnNumber) + '%'
AuditBase)
票数 0
EN

Database Administration用户

发布于 2019-09-17 23:40:58

根据您提供的示例数据,一个条目被存储为<comma><value>。因此,匹配需要反映这一点:

代码语言:javascript
复制
t3.AttributeMask LIKE '%,' + CAST(t1.ColumnNumber AS VARCHAR(10)) + '%'

(CAST vs. CONVERT最终是一个品味问题,但明确指定VARCHAR's长度可以消除默认设置的特定上下文性质。)

然而,当数据仅包含1011时,上述情况与101的匹配情况不一致。因此,我们需要以下内容(或解决相同问题的其他方法):

代码语言:javascript
复制
(t3.AttributeMask LIKE '%,' + CAST(t1.ColumnNumber AS VARCHAR(10))
    OR (t3.AttributeMask LIKE '%,' + CAST(t1.ColumnNumber AS VARCHAR(10)) + ',%'

这假设AttributeMask只包含逗号和数字。如果不能假设这一点,或者实际上不能假定一个前导逗号,那么每次都需要进行一点数据清理(当然,如果可能的话,最好避免):

代码语言:javascript
复制
INNER JOIN AuditBase              t3
ON t2.ObjectTypeCode=t3.ObjectTypeCode
WHERE t2.ObjectTypeCode=1 
    AND ',' + REPLACE(t3.AttributeMask, ' ', '') + ','
        LIKE '%,' + CAST(t1.ColumnNumber AS VARCHAR(10)) + ',%'

考虑到LIKE测试的性质,在这个版本中总是在逗号前加上逗号是无害的。

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

https://dba.stackexchange.com/questions/249003

复制
相关文章

相似问题

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