我有这种记录:
Rajkot,Gandhinagar
但是我想要改变上面的记录,如下面的记录。
'Rajkot','Gandhinagar'
因为我想使用IN运算符来获得结果。
答案 0 :(得分:2)
请注意,如评论中所述,使用联结表通常会表现得更好。
然而,假设你坚持设计:
TableA
ID ValueList
1 Uno,Dos,Tres
2 Foo,Bar,Baz,Quux
你想做相同的事情:
Select *
from TableA a
where @Value in ValueList -- ERROR
试试这个:
Select *
from TableA a
where ','+ValueList+',' like '%,'+@Value+',%'
如果你想这样做:
select *
from TableA b
where b.Value in (select ValueList from TableA a where a.ID = b.ID)
尝试:
select *
from TableB b
where exists (
select 1 from TableA a
where a.ID = b.ID and ','+a.ValueList+',' like '%,'+b.Value+',%'
)
有关设计和性能的说明:此设计可防止在列ValueList
上使用任何索引。如果出现这种情况可能不是问题:
TableA非常小并且具有非常少的行(例如,<10行)。这是因为如果数据适合一页或两页,查找索引所涉及的开销可能大于仅扫描页面和进行字符串比较所涉及的开销。
或者实际上只搜索了一小部分行。
例如,如果您通过唯一键查找单个行,或者通过有效索引查找几十行,并且只想根据字符串是否在ValueList
中进行过滤,这可能比联结表更快,因为数据保存在同一页面中。
换句话说,如果您不是通过此列表中的值搜索,而只是过滤,则可能不值得将它们放入联结表中
与往常一样,不应该对设计采用教条,而是 测试 。
答案 1 :(得分:0)
代码:
select ''''+substring('Rajkot,Gandhinagar',1,charindex(',','Rajkot,Gandhinagar',0)-1)+'''' + ',' +''''+
substring('Rajkot,Gandhinagar',charindex(',','Rajkot,Gandhinagar',0)+1,len('Rajkot,Gandhinagar'))+''''