【问题标题】:trim value in sql where conditionsql where条件中的修剪值
【发布时间】:2017-01-26 21:32:13
【问题描述】:

我的 db abc 表中有一行记录,col1 的值为 '00012345'。

要求:'00012345'等于'12345',去掉前面的所有'0'。

这是我的 sql 查询:

SELECT * FROM abc WHERE col1 = '12345';

这个查询不会返回任何结果,除非我把它改成

SELECT * FROM abc WHERE col1 LIKE '%12345';

但这会违反规则,例如如果我在 db 中的值为 '00912345', 那么 '00912345' 不等于 '12345' 修剪掉前面的所有 '0'。

在进行比较时,请告知如何修剪 db 中的值。

【问题讨论】:

  • Remove leading zeros的可能重复
  • 为什么要在字符列中存储整数值?
  • 使用如下语法 Select * from table_1 where LTRIM(name,'0') = '12345';

标签: java sql db2 conditional-statements where


【解决方案1】:

您可以尝试将col1 转换为数字类型(例如int),然后检查是否相等:

SELECT *
FROM abc
WHERE CAST(col1 AS INT) = 12345

但如果col1 存储的是数字数据,则将该列转换为数字类型可能比VARCHAR 更有意义。

【讨论】:

    【解决方案2】:

    您已经标记了这个 DB2,所以我假设您在使用 DB2 语法。这是

    select * from abc where cast(col1 as integer) = 12345
    

    【讨论】:

      【解决方案3】:

      根据你的版本和平台,你可以试试这个:

       WHERE TRIM(L '0' FROM col1) = '12345'
      

      或者这个:

      WHERE LTRIM(col1, '0') = '12345'
      

      【讨论】:

        【解决方案4】:

        适用于 DB2 v9 的解决方案

        SELECT * FROM abc WHERE TRIM(L '0' FROM col1) = '12345'

        在 DB2 v10 中应该也可以使用 LTRIM

        【讨论】:

          【解决方案5】:

          据我估计,OP 以不恰当的视角解决了这个问题。

          鉴于此,数据的存储方式是已知的,然后只需正确组合文字以匹配关于数据存储方式的规则。从存储在数据库中的每个值中修剪前导零,或将每个值强制转换为匹配数字类型的值以供选择是 IMO,一个糟糕的实现。

          我们[读者]最好假设文字将来自用户输入,因此不能让任何用户有责任重新格式化他们的输入以匹配数据库.因此,与其让用户正确组合文字值,不如让程序员修改文字选择值以匹配数据的存储方式。

          如果字符串值“12345”是指定的[用户输入]值,则可以在查询中组成一个表达式,该查询修改该文字值。这将完成,而不是编写一个转换列和\或可能还转换文字的表达式。例如,根据以下给定,下面进一步显示的可能的查询 WHERE 子句变体之一 [使用 SQL 变量语法表示] 应该会有所帮助:

          create variable literal_replacement varchar(8) default '12345'
          ; /* used in place of actual literal string value as user input */
          create table abc
          ( col1  char(08)
          ) /* My interpretation, as per typical, the OP offers no DDL */
          ;
          create function col1_compare_val
          ( string_val varchar(08) )
          returns char(08)
          language sql
           return right( '00000000' concat string_val, 8 )
          ; /* possible example of encapsulating code to reformat user input */
          


          WHERE col1 = repeat( '0', 8 - length( literal_replacement ) ) concat literal_replacement
          
          WHERE col1 = ( lpad( literal_replacement, 8, '0' ) )
          
          WHERE col1 = right( '00000000' concat literal_replacement , 8 )
          
          WHERE col1 = col1_compare_val( literal_replacement )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-10
            • 2016-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-30
            • 2017-12-19
            • 2017-11-01
            相关资源
            最近更新 更多