运算符中的SQL Server查询

时间:2016-09-15 10:34:27

标签: sql sql-server

我有这种记录:

Rajkot,Gandhinagar

但是我想要改变上面的记录,如下面的记录。

'Rajkot','Gandhinagar'

因为我想使用IN运算符来获得结果。

2 个答案:

答案 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'))+''''