【发布时间】:2008-12-19 15:39:12
【问题描述】:
我有一列包含 C5、C6、C3、CC、CA、CD 等字段。
我希望能够找到所有包含字母和数字(例如 C5 和 C6)的列。
我知道我是否这样做:
SELECT * FROM TABLE WHERE FIELD LIKE 'C%'
它也会返回 CC、CA、CD,但我不想这样,我只想返回数字。我也想更新这个列删除数字,所以C5变成C,C6变成C等等。
【问题讨论】:
标签: sql-server tsql
我有一列包含 C5、C6、C3、CC、CA、CD 等字段。
我希望能够找到所有包含字母和数字(例如 C5 和 C6)的列。
我知道我是否这样做:
SELECT * FROM TABLE WHERE FIELD LIKE 'C%'
它也会返回 CC、CA、CD,但我不想这样,我只想返回数字。我也想更新这个列删除数字,所以C5变成C,C6变成C等等。
【问题讨论】:
标签: sql-server tsql
查询将是SELECT * FROM TABLE WHERE FIELD LIKE 'C[0-9]%'
【讨论】:
Microsoft 的 Like 参考提供了有关您可以在该类型语句中使用的表达式的信息。
【讨论】:
您真正需要做的是重新设计您的结构,因为您不应该以这种方式存储数据。子表是存储此类数据的方式,然后您可以轻松查询和更新。已接受解决方案的问题是,如果文本不以 C 开头,您仍然会遇到问题,并且如果同一文本组中有多个 C5、C6,则更新充其量是不准确的。这违反了数据库设计的绝对第一原则,每行的列中永远不要存储超过一条信息。
如果您真的想要一种准确的方法来查找和更新这些记录(即使您无法更改结构),您需要将它们拉出到一个相关的临时表中,该表具有 record_Id 和 value 和更新位柱子。然后找到带有数字的并更新它们和同时提交的更新标志。然后对于具有至少一个标志的记录 ID,您将重新创建字符串并更新记录本身。如果 C5 和 C6 都在数据字符串中,您还需要决定是否只需要 C 的两个值。
【讨论】:
使用其中任何一个
select LEFT(col,1) from @t where col like 'c[0-9]%'
select substring(col,1,1) from @t where col like 'c[0-9]%'
【讨论】: