表 t1,有个字段aaa
ID aaa
1 a1,a2
2 a2,a4
3 a8
4
5 a9,a1需得到结果:
a1
a2
a4
a8
a9
若能按出现的次数排序就更完美了
先谢谢!
ID aaa
1 a1,a2
2 a2,a4
3 a8
4
5 a9,a1需得到结果:
a1
a2
a4
a8
a9
若能按出现的次数排序就更完美了
先谢谢!
解决方案 »
- 真没想到,小小问题难倒英雄汉
- 请教C#怎么在应用程序中找到Word文档名称
- 这个怎么实现啊。。多谢好心人大虾指点啊。。。
- 我在搜索数据库的时候 输入"C#" 只显示出 包含"C"的结果
- C#关于Excel的问题
- 有关Tree View 和Button问题
- 请问在vs2005(c#),在radiobutton(radiobutton是随机产生的)被选中时,触发其他的事件?
- .net 有没有什么类可以分析html ,然后得到现在已加载页面内的某种元素,例如图片?
- 求教关于PictureBox的问题
- .net编的东西如何在没有.net的系统上运行呢?
- SQL中的decimal类型的要让其空该怎么做
- 雪地裸体360度高分跪求 .Net1.1 C#接收Pop3邮件的例子
DataTable dt = db.ExecuteDataTable(strSql);
List<string> tagList = new List<string>();
foreach (DataRow dr in dt.Rows)
{
foreach (string tmp in dr["tag"].ToString().Split(' '))
{
bool isNew = true;
foreach (string tmp2 in tagList)
{
if (tmp == tmp2)
{
isNew = false;
break;
}
}
if (isNew) tagList.Add(tmp);
}
}
后台要对字符串处理很麻烦。其他没有什么,
也就是创建一个临时表,储存两个字段,一个是a1.a4.a8这样的内容,一个放次数。
然后用order by很容易就排出你想要的顺序。sql的帮助找一下字符处理就可以做出来了,不难的。
{
string[] array = dr["tag"].ToString().Split(' ');
foreach (string tmp in array)
{
if (!tagList.Contains(tmp))
tagList.Add(tmp);
}
}
create Function Split(@Sql varchar(8000),@Splits varchar(10))
returns @temp Table (a varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End
--建立测试数据
create table t1
(id int identity(1,1),aaa varchar(1000))
--插入数据
insert into t1
select 'a1,a2' union all
select 'a2,a4' union all
select 'a8' union all
select '' union all
select 'a9,a1'--获取数据
declare @sql varchar(8000)
set @sql = 'select distinct * from split('''
select @sql = @sql + aaa + ',' from t1 where isNull(aaa,'')<>''
if right(@sql,1)=','
set @sql = left(@sql,len(@sql)-1)exec(@sql+ ''','','');')/*
结果
a ---------------
a1
a2
a4
a8
a9*/
我觉得有百分之九十的可能是数据库设计不合理,要么就用XML字段得了,要么牺牲一点冗余吧!这样放在一个字段里,都不能看作一个集合,也用不了IN运算...
create table t1
(id int identity(1,1),aaa varchar(1000))
--插入数据
insert into t1
select 'a1,a2' union all
select 'a2,a4' union all
select 'a8' union all
select '' union all
select 'a9,a1'--方法一
DECLARE @S AS VARCHAR(8000)
SET @S=''
SELECT @S=@S+'UNION ALL SELECT '''+REPLACE(aaa,',',''' AS _COLUMN UNION ALL SELECT ''')+''' AS _COLUMN '
FROM t1 WHERE aaa<>''
SET @S=' SELECT DISTINCT _COLUMN AS _COUNT FROM ('+STUFF(@S,1,10,'')+' ) TB '
EXEC(@S)
--方法二
SELECT TOP 8000
id = IDENTITY(int, 1, 1)
INTO #
FROM syscolumns a, syscolumns b
SELECT
DISTINCT 姓名=SUBSTRING(A.[aaa], B.id, CHARINDEX(',', A.[aaa] + ',', B.id) - B.id)
FROM t1 A, # B
WHERE SUBSTRING(',' + A.[aaa], B.id, 1) = ',' and aaa<>''
--方法三(SQL SERVER 2005)
SELECT
B.keyword
FROM(
SELECT id, [aaa] = CONVERT(xml,
'<root><v>' + REPLACE([aaa], ',', '</v><v>') + '</v></root>')
FROM TB WHERE aaa<>''
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)')
FROM A.[aaa].nodes('/root/v') N(v)
)B
--结果
/*
_COUNT
------
a1
a2
a4
a8
a9
*/
--删除测试环境
drop table t1
drop table #
Drop table AAcreate TABLE AA(id int,title nvarchar(100))
Insert AA values(3456,'601988,600028,HK3988,HK0386')
Insert AA values(3457,'601988,600028')-- 生成只有一列且自动递增临时表
select top 8000 id=IDENTITY(int,1,1)
into #T FROM syscolumns a,syscolumns bSelect * From #TSELECT
AA.ID, title=SUBSTRING(AA.title, #T.ID, CHARINDEX(',', AA.title + ',', #T.ID) - #T.ID)
FROM AA, #T
WHERE SUBSTRING(',' + AA.title, #T.id, 1) = ','
ORDER BY 1,2
Drop table AA
Drop Table #T
对上个查询结果进行Select distinct title From (上查询结果) 即可