当前位置: 首页 > 面试题库 >

在PGSQL中模拟MySQL的substring_index()

弘兴言
2023-03-14
问题内容

我想找到一种优雅的方法来模拟Postgres中MySQL的subtring_index()函数的行为。

在MySQL中,它很简单:

mysql> create temporary table test1(test varchar(200));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values('apples||oranges'),('apples||grapes');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+-----------------+
| test            |
+-----------------+
| apples||oranges |
| apples||grapes  |
+-----------------+
2 rows in set (0.00 sec)

mysql> select substring_index(test, '||', 1) as field1, substring_index(test, '||', -1) as field2 from test1;
+--------+---------+
| field1 | field2  |
+--------+---------+
| apples | oranges |
| apples | grapes  |
+--------+---------+
2 rows in set (0.00 sec)

但是我目前在PGSQL上的工作非常丑陋:

hoth=# create temporary table test1(test text);
CREATE TABLE

hoth=# insert into test1 values('apples||oranges'),('apples||grapes');
INSERT 0 2

hoth=# select * from test1;
      test       
-----------------
 apples||oranges
 apples||grapes
(2 rows)

hoth=# select substring(test, 0, position('||' in test)) as field1,  substring(test, position('||' in test) + 2, char_length(test)) as field2  from test1;
 field1 | field2  
--------+---------
 apples | oranges
 apples | grapes
(2 rows)

也许有使用正则表达式的更优雅的解决方案,或者甚至将字符串拆分为一个变量数组,如果该字符串是从子查询或其他内容派生的,则可以减少开销,我欢迎提出任何建议。


问题答案:

总是花时间浏览手册。

http://www.postgresql.org/docs/current/static/functions-
string.html

如果split_part(string text, delimiter text, field int)没有做您想做的(以及更多,如果我了解您的MySQL函数),那么您将需要解释在哪里以及为什么。



 类似资料:
  • 问题内容: 刚从MySQL首次尝试PostgreSQL。在我们的Rails应用程序中,我们有几个使用SQL的位置,如下所示: 很快就发现PostgreSQL不支持/不允许这样做。 有谁知道如何在PostgreSQL中模拟这种行为,还是我们必须将排序整理到代码中? 问题答案: 啊,gahooa太近了:

  • 问题内容: 如何在MySQL中的此表上做滞后处理以打印引号中的差异,例如: 问题答案: 这是我最喜欢的MySQL hack。 这是模拟滞后函数的方式: 保存上一行报价的值。对于第一行,@ quot是-1。 保留当前行的报价的值。 笔记: 子句在这里很重要,就像在常规窗口函数中一样。 您可能还想使用lag 来确保计算相同引号的差异。 您也可以以相同的方式实现行计数器 与该方案相比,与使用聚合函数,存

  • 问题内容: 我们将MySQL与InnoDB存储引擎和事务一起大量使用,并且遇到了一个问题:我们需要一种很好的方法来在MySQL中模拟Oracle的SEQUENCE。要求是:-并发支持- 事务安全-最大性能(意味着最小化锁和死锁) 我们不在乎是否不会使用某些值,即顺序上的间隔是可以的。有一个简单的方法来存档,即通过创建一个带有计数器的单独的InnoDB表,但这意味着它将参与事务并引入锁和等待。我正在

  • 问题内容: 我正在开发一个Web应用程序,该应用程序显然在iOS设备中存在问题。问题是我不拥有iOS设备,而是在Linux Ubuntu中进行开发。我正在寻找一种在Linux(尤其是浏览器)中仿真/模拟此OS的方法,但是还没有找到任何东西。 到目前为止,我发现的是iOS SDK的Simulator,但这是针对Mac的。还有一些Windows模拟器。有人做过吗? 问题答案: 我能想到的唯一解决方案是

  • 问题内容: 我有一些程序在评估病情后想得到某种确认。 例如,pusedocode就像 我应该如何在MySQL中做到这一点? 问题答案: 如果您不想两次将文本用作列标题和值,请使用以下stmt!

  • 问题内容: 这似乎是MySQL没有数组变量。我应该怎么用呢? 似乎提出了两种选择: set-type标 量表 和 临时表 。我链接的问题暗示了前者。但是,使用这些变量而不是数组变量是一种好习惯吗?或者,如果我使用集合,基于集合的成语等效于什么? 问题答案: 好吧,我一直在使用临时表而不是数组变量。不是最大的解决方案,但它可以工作。 请注意,您不需要正式定义它们的字段,只需使用SELECT创建它们: