我有一个列名的表,LIST_CODE
其中的数据如下 A101、A102、B101。
如何找到LIST_CODE
等于A102或B101的所有数据
我尝试使用下面的 sql 但它返回0
SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
我有一个列名的表,LIST_CODE
其中的数据如下 A101、A102、B101。
如何找到LIST_CODE
等于A102或B101的所有数据
我尝试使用下面的 sql 但它返回0
SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
如果您的意思是 list_code 可以在一行中包含“A101,A102,B101”,那么
select * from details_user
where list_code like'%A102%'
or list_code like '%B101%'
但这将是一个糟糕的数据库设计。
如果 list_code 可以包含
A101
A102
B101
(每行一个值)
那么你的代码是正确的,这只是意味着你没有 A102 或 C101 的行。
由于查询长度有限制,您可能还需要考虑构造一个正则表达式,例如 `SELECT count(*) FROM details_user RLIKE list_code RLIKE "A102|B100"。
无论如何,这都不是一个好的模式设计。
正如其他人所说,当您有应该成行的数据时,请将其成行放置。没有多少代码可以替代一个好的初始设计。
也就是说,您可以使用 sql server 2005 及更高版本中的 xml 函数将打包成单行的数据转换为更易于管理的情况。您可以执行以下操作:
select du.ID, Code.value('.','nvarchar(100)') as Code
from (select ID,
cast(('<c>'+replace(list_Code,',' ,'</c><c>')+'</c>') as xml) as xml
from details_user) du
cross apply du.xml.nodes('c') as T(Code)
这首先将字符串从'A101, A102'
格式转换为类似 XML 的格式,
'<c>A101</c><c>A102</c>'
.
然后将转换后的值输入到将代码分离到表中的nodes()函数中,然后使用value()方法从该表中提取代码的值。
您可以在此SQL Fiddle上使用此方法
我害怕'IN'运算符只适用于离散集,而不像你建议的那样适用于varchars。
因此,您必须使用常规 OR 语句或使用不同的值集定义。
SELECT count(*) FROM details_user WHERE list_code = 'A102' OR list_code ='C101'