【问题标题】:How to use LIKE condition in SQL with numeric field?如何在带有数字字段的 SQL 中使用 LIKE 条件?
【发布时间】:2009-07-10 07:24:31
【问题描述】:

我正在使用这个查询来获取一些特定的数据:“select * from emp where emp_name LIKE 's%'”;

emp_nam 是字符字段,我怎样才能使用与数字字段相同的逻辑条件?类似:

"select * from emp where emp_id ????

其中 emp_id 是数字字段。

谢谢,

【问题讨论】:

  • 你想达到什么目的?您是否正在寻找所有以例如开头的 ID 7?
  • 这取决于您的 DBMS 引擎,但大多数都支持。

标签: sql ms-access jet


【解决方案1】:

您不能对数字进行通配符,但是,如果您确实需要,可以将数字转换为 varchar,然后执行通配符匹配。

例如。

SELECT * FROM emp WHERE CONVERT(varchar(20), emp_id) LIKE '1%'

【讨论】:

  • 我正在使用 MS Jet,其中没有定义 CONVERT varchar?
  • 这不适用于 Jet 数据库,但类似的方法可以。使用 cstr() 而不是 convert(varchar... 语句。
【解决方案2】:

在 Access 中,您可以将数字字段与空字符串连接,以将其强制转换为可以使用 LIKE 进行比较的字符串:

select * from emp where emp_id & '' like '123*'

另请注意,Access 使用 * 而不是 % 作为通配符。见:Like Operator (Microsoft Access SQL)

【讨论】:

  • Access 仅在 ANSI-89 查询模式下使用 * 作为 SQL 代码中的通配符。看我的回答。
【解决方案3】:

不,您不能将LIKE 用于数字字段。 尝试使用 <,>=, >=, <= ;)

如果您想在数字字段中搜索“以 12 开头”之类的内容,那么您的设计不符合您的需求。

【讨论】:

    【解决方案4】:

    在 Access 数据库引擎 SQL 语法中,要使用 % 通配符,您必须使用 ANSI-92 查询模式或使用 ALIKE 关键字代替 LIKE 关键字。

    有关 ANSI-92 查询模式的详细信息,请参阅 Access2003 帮助中的About ANSI SQL query mode (MDB)(同样适用于 Access2007 中的 ACE,但出于某种原因,他们从 Access2007 帮助中删除了该主题)。如果您在代码中执行此操作,您将需要使用 OLE DB,例如VBA 中的 ADO 经典。

    对于ALIKE 关键字...你不会找到太多。这是官方未记录的功能之一,这意味着它可能会从 Access 数据库引擎的未来修订版中删除。就我个人而言,我会冒这个风险,因为必须为 ANSI-89 查询模式和 ANSI-92 查询模式显式编码,因为这是验证规则和CHECK 约束所必需的(参见下面的示例)。两者的编码都可以完成,但要做到正确会更加冗长和棘手,即如果你弄错了会有更大的直接风险。

    这就是答案。现在是“解决方案”...

    显然,如果您需要对 emp_id 执行此类查询,则该域是错误的,即它不应该是数字字段。

    治愈疾病:更改架构以使其成为文本字段,添加域规则以确保其仅包含数字字符,例如

    CHECK (emp_id NOT LIKE '%[^0-9]%')
    

    EDIT 现在已添加“Jet”标签。上述CHECK 约束需要重写,因为Access 数据库引擎有自己的语法:将^ 字符替换为!。此外,要使其与 ANSI-89 查询模式和 ANSI-92 查询模式兼容,请使用 ALIKE 关键字,即

    CHECK (emp_id NOT ALIKE '%[!0-9]%')
    

    【讨论】:

      【解决方案5】:

      '%' 通配符在 MS -SQL 服务器上为我工作。见http://technet.microsoft.com/en-us/library/aa933232%28v=sql.80%29.aspx

      查询 select * from MyTable where ID like '548%' 适用于 MS-SQL Server 2008 R2 并返回 ID 为 5481,5485 等的结果。ID 列是 int 类型。

      【讨论】:

        【解决方案6】:

        使用 CONCAT 隐式将整数转换为字符串

        SELECT * FROM city WHERE CONCAT(id_city,'') LIKE '%119%'

        【讨论】:

          【解决方案7】:

          emp_id 字段上使用castconvert 函数,您可以与like 进行比较。

          【讨论】:

          • Jet SQL 的哪些版本支持 CAST 和 CONVERT?
          • 我不知道 jet sql 但通过转换字符串你可以做到这一点
          • 在一些答案(包括我的)发布后添加了“Jet”标签;它最初只是标记为“sql”。
          • FWIW Jet(现在是 Access 数据库引擎)确实具有强制转换功能,例如CCURRENCY() 将转换为 CURRENCY。
          【解决方案8】:

          您好,我在使用浮点数时遇到了麻烦,我不得不将两次 cast(cast(EmpId as bigint) as varchar(15)) like '%903%' 希望有人觉得这有帮助

          【讨论】:

            【解决方案9】:

            在 FileMaker SQL 中,您可以使用 STRVAL 函数将任何字段转换为字符串:

            SELECT * FROM emp WHERE STRVAL(emp_id) LIKE '1%'


            这是在 FileMaker 中使用它的真实示例:

            如何列出数字字段中包含 ASCII 0 的所有记录

            SELECT emp_id FROM emp WHERE STRVAL(someNumericField) LIKE '%'+CHR(0)+'%'

            【讨论】:

              【解决方案10】:

              在 Where 子句中编写一个数值表达式。 例如:要选择以最后 2 位数字结尾的数字 Col1 作为 20, WHERE Column1-(Column1/100) = 20 (除以 100 是整数除法)。 要选择 Col1 何时应以 50 开头, 在哪里(Col1 >= 500 和 Col1 = 5000 和 Col1 OR ( Col1 >= 50000 and Col1 其中 Col1> 0 AND Col1 / ((floor (log10 (abs (x))) + 1 - 2) * 100)= 50 (-2 是获取 Col1 的前 2 位数字)。

              【讨论】:

                猜你喜欢
                • 2021-10-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-28
                • 2011-06-02
                • 1970-01-01
                相关资源
                最近更新 更多