【问题标题】:How to compare a part of a string using like function SQL如何使用类似函数 SQL 比较字符串的一部分
【发布时间】:2020-09-12 16:18:00
【问题描述】:

我不确定是否可以使用类似函数来比较字符串,或者是否有其他函数可以实现这一点,但这是我的情况,我有以下部分:

R71-14-40000-ATN-LH-D-PF,第三段(40000)为长度;前 3 位为整数部分,后 2 位为小数部分。

我想从数据库中获取长度(第三段)等于或大于该值的所有部分,例如,如果我使用上述部分,我应该得到黄色值并省略其他值(这些值可以也可以是 R71-14-50000-ATN-LH-D-PF, R71-14-55000-ATN-LH-D-PF, R71-14-60000-ATN-LH-D-PF, 不只是从 4 等开始)。

我试过这个 PartNum like '%R71-14-%-ATN-LH-D-PF%' 但无论第三段值如何,我都得到了所有部分

【问题讨论】:

  • 您使用的是什么 DBMS(SQL Server、MySQL、Oracle 等)?请适当标记您的问题

标签: sql-server string compare sql-like


【解决方案1】:

使用更多限制的 LIKE 值,例如

PartNum LIKE 'R71-14-4____-ATN-LH-D-PF'

将回答“第 3 段以 4 开头的值”的特定查询。它也可以是..14-4%-ATN..,尽管我选择了_ match-exactly-one 通配符来明确固定的第 3 段长度 (5);引擎也更容易匹配。

然后在此固定宽度数据下扩展为“等于或大于 4”可以通过选择以 4、5 或 6 开头的第 3 段来完成。

PartNum LIKE 'R71-14-[456789]____-ATN-LH-D-PF'

这适用于SQL Server,尽管在不同的 RDMBS 实现中可能会有细微的差异。这种方法是基于词法的,即使它不使用/利用数字相等,它也适用于单字符整数值。 SQL Server 还支持有用的字符否定 - 请参阅特定 RDBMS 的文档。

根据显示的数据,不需要前导和尾随 %。使用前导 % 也可能对索引使用非常不利。

如果不关心其余部分,尾随 % 会更有意义,

PartNum LIKE 'R71-14-[456789]____-%'

如果需要关心第三段,

PartNum LIKE '___-__-[456789]____-%'
PartNum LIKE '___-__-[456789]%'      -- or even this

注意与原始查询 (..14-%-ATN..) 的区别,它与预期的 all 值匹配。这是因为它没有对第 3 段值添加任何限制。

【讨论】:

    【解决方案2】:

    我认为你可以使用子字符串:

    where substring(col, 8, 5) >= substring('R71-14-40000-ATN-LH-D-PF', 8, 5)
    

    一些数据库使用substr() 而不是substring()

    【讨论】:

    • ANSI/ISO 版本是substring(col from 8 for 5)
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2023-02-14
    • 2013-10-08
    相关资源
    最近更新 更多