【问题标题】:Select substring with dashes in SQL在 SQL 中选择带有破折号的子字符串
【发布时间】:2021-02-25 09:34:28
【问题描述】:

我有一个名为 package_type 的列,它包含如下字符串:

TP-CYS01-01-2700-W-003
TP-CYS01-01-2700-W-004
TP-CYS01-02-2700-W-003
TP-CYS01-02-2700-W-001

我需要计算package_type,但按package_no 分组,即CYS01-01CYS01-02

我所做的是这样的:

select 
    substring(substring(package_type, '-', 3), '-', -2) as package_no,
    count(distinct package_type)
from
    project_june 
where 
    progress = bill_of_quantity and event_date = '2020-06-12'
group by 
    substring(substring(package_type, '-', 3), '-', -2) as package_no

我收到此错误:

整数的输入语法无效:“-”

我希望结果会是这样的:

package_no   count
------------------
CYS01-01      2
CYS01-02      2

我应该如何编写这个查询?

谢谢。

【问题讨论】:

  • 您不能在 GROUP BY 子句中定义列别名。跳过 AS ... 部分-
  • 您使用的是哪个 dbms?
  • 我删除了AS,还是报错
  • Wong 类型的论据:substring(string, integer, integer)
  • 编写查询时,请采取更小的步骤。当第一个子字符串起作用时,添加第二个。然后添加 group by 等。

标签: sql string count aggregate-functions


【解决方案1】:

您的字符串似乎具有固定格式——您希望从第 4 个位置开始有 8 个字符。这表明您可以使用:

select substring(package_type, 4, 8), as package_no,
       count(distinct package_type)
from project_june 
where progress = bill_of_quantity and
      event_date = '2020-06-12'
group by substring(package_type, 4, 8);

毫无疑问,还有其他方法可以编写这样的查询。但是,字符串函数通常是特定于数据库的,您的问题并未指定您使用的数据库。

【讨论】:

    【解决方案2】:

    错误消息表明您正在运行 Postgres。该数据库具有强大的字符串功能-您可以使用split_part()

    select split_part(package_no, '-', 2) as package_no, count(distinct package_type) as cnt
    from project_june 
    where progress = bill_of_quantity and event_date = date '2020-06-12'
    group by split_part(package_no, '-', 2)
    

    注意事项:

    • 据推测,event_date 是类似date 的数据类型,因此应该将其与文字日期而不是字符串进行比较。

    • 我怀疑progress = bill_of_quantity的情况; bill_of_quantity 是表中的实际列吗?如果它是一个文字字符串,那么它应该用单引号括起来

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多