【问题标题】:Use LIKE '%' with integer in SQL在 SQL 中使用带整数的 LIKE '%'
【发布时间】:2013-10-31 21:16:21
【问题描述】:

我在 SQl Server 中有这个过程:

create procedure AutoSearchTeamByMobile
@Team_Mobile int
As
select * from Team_Info where Team_Mobile like @Team_Mobile+'%';

我在 C# 中有这段代码:

private void textBoxX4_TextChanged(object sender, EventArgs e)
    {
        int tMobile= int.Parse(textBoxX4.Text);
        SqlCommand com = new SqlCommand("AutoSearchTeamByMobile", con);
        com.Parameters.Add("@Team_Mobile", SqlDbType.Int).Value = tMobile;
        com.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();
        da.SelectCommand = com;
        da.Fill(ds, "Team_Info");
        dataGridViewX1.DataSource = ds.Tables["Team_Info"];
    }

我有一个手机号码列表,它们保存在名为Team_Mobile的列中,数据类型为int,其中一个以'711......'开头,另一个以'700.. ....',所以现在当我在textBoxX4 中只写“7”时,所有数字(以 711 或 700 开头)都应该出现在dataGridViewX1 中,但是当我写“71”时,只有以数字开头的数字带有“711”的可能会出现在dataGridViewX1 中。当我写“70”时,只有以 700 开头的数字才会出现在dataGridViewX1 中。我没有得到我需要的东西,实际上我没有看到任何与我没有做任何事情相同的事情。

我的需要,当我写 71 时,Team_Mobile 列中所有有 711 的记录应该仍然出现,其他数字应该隐藏。

但是我用Team_Names 做的,它可以工作,因为Team_Names 的数据类型是nvarchar,但Team_Mobileint

sql:

create procedure AutoSearchTeam
@Team_Name nvarchar (50)
As
select * from Team_Info where Team_Name like @Team_Name+'%';

C#:

    private void textBoxX1_TextChanged(object sender, EventArgs e)
    {
        string t_name = textBoxX1.Text;
        SqlCommand com = new SqlCommand("AutoSearchTeam", con);
        com.Parameters.Add("@Team_Name", SqlDbType.NVarChar, 50).Value = t_name;
        com.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();
        da.SelectCommand = com;
        da.Fill(ds, "Team_Info");
        dataGridViewX1.DataSource = ds.Tables["Team_Info"];
    }

我的问题是:有没有办法用整数替换%

我可以用什么替换 % 以使用整数来获得我上面解释的内容?

对不起我的英语。

【问题讨论】:

  • 好课。电话号码只是巧合的数字。由于您永远不会期望对它们进行数学运算,因此它们实际上是字符串,应该这样存储。
  • @Brad |非常感谢。

标签: c# stored-procedures datagridview textbox sql-server-2008-r2


【解决方案1】:

例如这个

SELECT * FROM Team_Info WHERE Team_Mobile LIKE CAST(@Team_Mobile AS NVARCHAR) + '%';

【讨论】:

  • 啊!我不明白他在问什么。 :) +1
  • @ManyMar 您收到什么错误?或者它不工作的迹象是什么?
  • 你确定你有匹配约束的值吗?
  • @paqogomez|是的,我无法上传图片让您也了解我的需求。我需要至少 10 声望才能发布图片。
  • 对不起,我把 CAST 放在了错误的变量上,我编辑了它,现在它已经修复了。
【解决方案2】:

LIKE 运算符是一个字符串 函数。它需要一个字符串输入来进行测试,并会在进行比较之前尝试自动将输入值转换为字符串(varcharnvarchar)。由于这种隐式转换,您可以将 if 用于数字。

您的代码中的问题是您添加了intvarchar。尝试将您的存储过程重写为:

CREATE PROCEDURE AutoSearchTeamByMobile
    @Team_Mobile int
AS
SELECT * FROM Team_Info WHERE Team_Mobile LIKE CAST(@Team_Mobile AS NVARCHAR) + '%';

@Team_Mobile 转换为varchar 将使+ 运算符正确运行,并应为您提供所需的结果。


一个风格点...

由于各种原因,将电话号码存储为整数可能会出现问题。在某些时候,您会遇到无法存储在有限整数范围内的电话号码。我的一个数据库中有数千个电话号码,长度为 16 个字符,即使我去掉了国际拨号说明符,它们也不适合整数。

将您的电话号码存储为varcharnvarchar,总体而言,您会更轻松。

【讨论】:

  • 非常感谢你,伙计。你做到了,你是最好的人^_^
【解决方案3】:

是的,我相信您可以通过:

SELECT * FROM MyTable WHERE Team_Mobile >= @Team_Mobile

在不修改数据类型的情况下返回大于 700 的任何值(根据您的示例)。

或许

SELECT * FROM MyTable WHERE CAST(Team_Mobile AS NVARCHAR(MAX)) LIKE @Team_Mobile + '%'

将列转换为字符串,从而允许您使用通配符。

【讨论】:

  • 不工作@_@。等等我再用图片例子解释一下。
  • 抱歉,我无法上传图片,他们说“您必须至少 10 声望才能上传图片。
  • 在整数字段上比较 >= @Team_Mobile 将返回 所有 行,其 numeric 值大于 @Team_Mobile。如果@Team_Mobile 只有几位数字,那将在表格中提供几乎所有电话号码。当然,您必须转换为 (n)varchar 才能进行文本比较。
  • 选择了所有有 700 和 711 的记录
猜你喜欢
  • 2011-08-10
  • 2015-02-05
  • 1970-01-01
  • 2021-12-24
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多