我们可以选择数据库中没有空格的行之间有空格的数据吗?

时间:2017-01-02 14:20:25

标签: sql sql-server

我有一个文本框可以在我的桌子上进行搜索。我的表名是ADDRESSBOOK,这个表包含姓名,姓氏,电话号码等人员记录。电话号码持有“0 123 456789”。如果我在我的文本框中写入“0 123 456789”,此代码正在运行

SELECT * FROM ADDRESSBOOK WHERE phonenumber LIKE "0 123 456789" 

我的问题是如何在文本框中写入“0123456789”来选择同一行。我的英语是

3 个答案:

答案 0 :(得分:3)

你可以使用replace(): 在哪里取代(phonenumber,'','')像替换('0 123 456789','','') 如果性能是一个问题,您可以在SQL Server中执行以下操作: alter table t添加列phonenumber_nospace as(replace(phonenumber,'',''); 在t上创建索引idx_t_phonenumber_nospace(phonenumber_nospace); 然后,在构造查询之前删除参数值中的空格,并使用: 在哪里phonenumber_nospace = @phonenumber_nospace 这假定了一个相等比较,如在您的示例中。

答案 1 :(得分:0)

如果存储电话号码的特定格式,您可以在特定位置插入空格,而不是将其传递给数据库查询。

例如,您在问题编号0 123 456789中提到过。

如果在第四个数字之后的第一个数字和空格之后有空格,那么您可以从文本框中取出文本并在第二个位置和第六个位置插入空格(因为在第二个位置添加空格后+接下来的三个位置是第六个position)并将该文本传递给数据库查询。

答案 2 :(得分:0)

Db设计的一个重要部分是确保数据的一致性。存储越一致,查询就越容易。这就是为什么您应该确保列使用正确的数据类型的原因:

  • 日期/时间列应使用适当的日期/时间类型。
  • 数字列应使用适当大小的数字类型。 (没有这个数字varchar垃圾。)
  • 字符串列的长度应合适(charvarchar)。
  • 具有引用关系的列永远不应存储对引用表的无效引用。

同样,您需要确定存储电话号码时要使用的确切格式;并确保您存储号码的任何时候都能如此一致地完成。

有些查询会很复杂。只要您无法依赖一致的格式,查找数据的查询就需要满足所有可能的变化。他们不太可能有效地利用指数。

  

我看到有人赞成将电话号码存储为数字数据。 (毕竟这是"数字"。)虽然我并不真正相信,因为这种方法无法代表前导零(这可能是可取的)。

结论

每当您插入/更新电话号码时,请确保其以一致的格式存储。 (注意:您可以灵活地了解数字对用户的显示方式。只有存储的值需要保持一致。)

每当您搜索电话号码时,请在搜索前将搜索值转换为兼容格式。

由您决定在何处/如何进行这些转换。但您可能希望考虑CHECK约束,以确保如果您在某个时候未能正确转换数字,则不会意外地以不正确的格式存储。 E.g。

CONSTRAINT CK_NoSpacesInTelno CHECK (Telephone NOT LIKE '% %')
相关问题