【问题标题】:MySQL user wildcard use BETWEEN [duplicate]MySQL用户通配符使用BETWEEN [重复]
【发布时间】:2017-06-13 18:18:51
【问题描述】:

我的 MySQL 查询有问题,这是我的查询:

select `BKC ID`,`Nama Pengirim`,sum(`¢ Koli`) as `Koli`,sum(`Harga`) as `Harga Barang`, sum(`Uang Administrasi`) as `Admin.`, sum(`Uang Penerus`) as `Uang Penerus`, `Tujuan`
from `transaksi` 
join `transaksi barang` 
ON `transaksi barang`.`BARANG ID` LIKE concat(`transaksi`.`BKC ID`, '-%')
WHERE `BKC ID` BETWEEN ('%1705%' AND '%1706%')
group by `BKC ID` DESC

但是那个查询是错误的,错误是can't to use WILDCARD at BETWEEN function,

我找不到替代品@google.com(搜索) BKC ID 的类型是 varchar,例如 "ABC170101102912"

感谢您的提前。

【问题讨论】:

  • 不,不一样,我已经找到了,但这不一样,我的类型是“varchar”而不是 interget 、 decimal 或所有关于数字的相同。 @阿尔文
  • 什么是更改我的查询@saveen 的替代方法?
  • 不,您不能在 between 语句中使用通配符。由于通配符可能意味着任何东西,即无穷大,它永远不会返回。还记得 % 表示任意数量的字符,因此我应该从哪里开始或停止?
  • "错误是不能在 BETWEEN 函数中使用 WILDCARD" 不,不是。没有这样的错误信息。
  • 这种问题是设计不佳的表现

标签: mysql regex


【解决方案1】:

您要检查的数字似乎是一年和一个月。

所以从 2010 年到 2019 年,这个数字总是以 1 开头

因此,您可以定位前 1 的位置,然后使用子字符串获取接下来的 4 个字符。

然后将该子字符串与日期范围进行比较。

...
WHERE cast(substring(`BKC ID`, locate('1',`BKC ID`), 4) as unsigned) between 1701 and 1706
...

这是假设字符串的第一个字母部分没有固定长度。
因为如果你知道它总是 3 个字符,那么它可以被简化:

...
WHERE cast(substring(`BKC ID`,4,4) as unsigned) between 1701 and 1706
...

【讨论】:

    【解决方案2】:

    如果您要测试的值从字符串中的第一个数字位置开始,您可以这样做

    MariaDB [sandbox]> select 'ABC170101102912',
        ->  cast(
        -> SUBSTR('ABC170101102912',LEAST (
        ->     if (Locate('0','ABC170101102912') >0,Locate('0','ABC170101102912'),999),
        ->     if (Locate('1','ABC170101102912') >0,Locate('1','ABC170101102912'),999),
        ->     if (Locate('2','ABC170101102912') >0,Locate('2','ABC170101102912'),999),
        ->     if (Locate('3','ABC170101102912') >0,Locate('3','ABC170101102912'),999),
        ->     if (Locate('4','ABC170101102912') >0,Locate('4','ABC170101102912'),999),
        ->     if (Locate('5','ABC170101102912') >0,Locate('5','ABC170101102912'),999),
        ->     if (Locate('6','ABC170101102912') >0,Locate('6','ABC170101102912'),999),
        ->     if (Locate('7','ABC170101102912') >0,Locate('7','ABC170101102912'),999),
        ->     if (Locate('8','ABC170101102912') >0,Locate('8','ABC170101102912'),999),
        ->     if (Locate('9','ABC170101102912') >0,Locate('9','ABC170101102912'),999)
        ->   , length('ABC170101102912') ),4)
        ->   as int)   as NewString,
        ->
        ->    case when  cast(
        -> SUBSTR('ABC170101102912',LEAST (
        ->     if (Locate('0','ABC170101102912') >0,Locate('0','ABC170101102912'),999),
        ->     if (Locate('1','ABC170101102912') >0,Locate('1','ABC170101102912'),999),
        ->     if (Locate('2','ABC170101102912') >0,Locate('2','ABC170101102912'),999),
        ->     if (Locate('3','ABC170101102912') >0,Locate('3','ABC170101102912'),999),
        ->     if (Locate('4','ABC170101102912') >0,Locate('4','ABC170101102912'),999),
        ->     if (Locate('5','ABC170101102912') >0,Locate('5','ABC170101102912'),999),
        ->     if (Locate('6','ABC170101102912') >0,Locate('6','ABC170101102912'),999),
        ->     if (Locate('7','ABC170101102912') >0,Locate('7','ABC170101102912'),999),
        ->     if (Locate('8','ABC170101102912') >0,Locate('8','ABC170101102912'),999),
        ->     if (Locate('9','ABC170101102912') >0,Locate('9','ABC170101102912'),999)
        ->   , length('ABC170101102912') ),4)
        ->   as int) between 1701 and 1706 then 'Between'
        ->   else 'not between'
        ->   end as isit;
    +-----------------+-----------+---------+
    | ABC170101102912 | NewString | isit    |
    +-----------------+-----------+---------+
    | ABC170101102912 |      1701 | Between |
    +-----------------+-----------+---------+
    1 row in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2016-01-25
      • 1970-01-01
      • 2021-03-03
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多