1

我有一个列名的表,LIST_CODE其中的数据如下 A101、A102、B101。

如何找到LIST_CODE等于A102B101的所有数据

我尝试使用下面的 sql 但它返回0

SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
4

4 回答 4

1

如果您的意思是 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 的行。

于 2013-01-18T08:05:45.300 回答
0

由于查询长度有限制,您可能还需要考虑构造一个正则表达式,例如 `SELECT count(*) FROM details_user RLIKE list_code RLIKE "A102|B100"。

无论如何,这都不是一个好的模式设计。

于 2013-01-18T08:12:54.943 回答
0

正如其他人所说,当您有应该成行的数据时,请将其成行放置。没有多少代码可以替代一个好的初始设计。

也就是说,您可以使用 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上使用此方法

于 2013-01-18T08:41:18.887 回答
0

我害怕'IN'运算符只适用于离散集,而不像你建议的那样适用于varchars。

因此,您必须使用常规 OR 语句或使用不同的值集定义。

 SELECT count(*) FROM details_user WHERE list_code = 'A102' OR list_code ='C101'
于 2013-01-18T15:22:48.257 回答