Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正则表达式:仅选择表达式的一部分_Sql_Regex_Teradata - Fatal编程技术网

Sql 正则表达式:仅选择表达式的一部分

Sql 正则表达式:仅选择表达式的一部分,sql,regex,teradata,Sql,Regex,Teradata,我不熟悉正则表达式,所以这可能是一个简单的解决方案,或者使用其他方法更好。请注意,我使用的是teradata SQL assistant 我的数据中的模式类型: 99a 99框1 99框1B 999 B 999 Bx 1 这些是门牌号,有时还附有箱号。我只想选择门牌号,有时是99a格式,在这种情况下也应该选择A 因此,对于上述四种情况,我的正则表达式(或者如果您有更好的选择,请随意选择)的结果应该是: 99a 99 99 99b 999 999 如果您的示例数据对整个数据集都很简洁,那么这

我不熟悉正则表达式,所以这可能是一个简单的解决方案,或者使用其他方法更好。请注意,我使用的是
teradata SQL assistant

我的数据中的模式类型:

  • 99a
  • 99框1
  • 99框1B
  • 999 B
  • 999 Bx 1
这些是门牌号,有时还附有箱号。我只想选择门牌号,有时是
99a
格式,在这种情况下也应该选择
A

因此,对于上述四种情况,我的正则表达式(或者如果您有更好的选择,请随意选择)的结果应该是:

  • 99a
  • 99
  • 99
  • 99b
  • 999
  • 999

如果您的示例数据对整个数据集都很简洁,那么这个解决方案就足够简单了

SELECT CASE WHEN LEN(field) = 4 THEN field ELSE LEFT(field, 2)
FROM yourtable

如果您的示例数据对整个数据集都很简洁,那么这个解决方案就足够简单了

SELECT CASE WHEN LEN(field) = 4 THEN field ELSE LEFT(field, 2)
FROM yourtable

这会解决你的问题

SELECT case when position('box' IN field)= 0 then field else 
                    substr(field, 1, length(field) - position('box' IN field) )  end
FROM yourtable

这会解决你的问题

SELECT case when position('box' IN field)= 0 then field else 
                    substr(field, 1, length(field) - position('box' IN field) )  end
FROM yourtable
Teradata也有这个功能

Teradata也有这个功能


你可能想用正则表达式来考虑这个解决方案:

select * from table where (reason regexp '(^[0-9][0-9]+$)|(^[0-9][0-9]+ [A-Z]?$)')

你可能想用正则表达式来考虑这个解决方案:

select * from table where (reason regexp '(^[0-9][0-9]+$)|(^[0-9][0-9]+ [A-Z]?$)')


你用的是什么数据库管理系统?你用的是什么数据库管理系统?你真的认为总有两位数的门牌号吗?@dnoeth你从OP的样本数据中有没有其他证据?因此,如果您的示例数据对整个数据集都很简洁,那么我就说明了
正如@dnoeth所指出的,也可以有3位数字。我希望它尽可能灵活。我可能不清楚。否则,当我使用
LENGTH
而不是
LEN
@匿名时,这将起作用。是的,示例数据应至少包括每种可能长度/类型/格式的数据中的一种。或者在解释中给出各种可能性。我的错,谢谢你提供这个答案。在将来记住这些功能是很有用的。你真的认为总是有两位数的门牌号吗?@dnoeth你从OP的样本数据中有没有证据表明不是这样的?因此,如果您的示例数据对整个数据集都很简洁,那么我就说明了
正如@dnoeth所指出的,也可以有3位数字。我希望它尽可能灵活。我可能不清楚。否则,当我使用
LENGTH
而不是
LEN
@匿名时,这将起作用。是的,示例数据应至少包括每种可能长度/类型/格式的数据中的一种。或者在解释中给出各种可能性。我的错,谢谢你提供这个答案。将来记住这些函数是很有用的。这会引发语法错误3707:在“')”和“SUBSTR”关键字之间应该有类似“END”的关键字。
position('box'在字段中)
after
else
必须删除,这样才能真正起作用。然而,它只适用于检测“盒子”,一旦它是其他东西,它就无法工作。但这是我的错,因为我没有提出问题和可能性broader@Anonymous:那么这些可能性是什么呢?这会引发一个语法错误3707:在“)”和“SUBSTR”关键字之间应该有一个类似“END”的关键字。
position('box'在字段中)
之后
否则
必须删除,这样才能真正起作用。然而,它只适用于检测“盒子”,一旦它是其他东西,它就无法工作。但这是我的错,因为我没有提出问题和可能性broader@Anonymous:那么这些可能性是什么呢?这是一个WHERE条件,但没有提取数字。我的错。我没有看到关于这个问题的编辑!!谢谢你指出!这是一个WHERE条件,但是没有提取数字。我的坏。我没有看到关于这个问题的编辑!!谢谢你指出@RhythemAggarwal实际上是一个非常基本的正则表达式
^
:行的开头,
\d+
:一个或多个数字
(\s+\w$)?
:可选捕获组
()?
,一个或多个空格
\s+
,一个单词字符
\w
,然后是行的结尾
$
。旁注:如果有像“12A”这样的门牌号,没有空格。然后只需将
\s+
更改为
\s*
\s*
:0个或更多的空格。这确实是我想要的,也非常感谢您的额外解释。@它工作得很好,但是什么部分可以确保它使用
99
而不是
99 Box
(别误会我的意思:我希望它能像这样执行,我只是想了解正则表达式如何只选择带有1个字符的单词)。@Anonymous,因为可选捕获组中有
$
\w
相当于
[a-zA-Z0-9]
。因此,
\w$
是一行末尾的单词字符。@RhythemAggarwal它实际上是一个非常基本的正则表达式。
^
:行的开头,
\d+
:一个或多个数字
(\s+\w$)?
:可选捕获组
()?
一个或多个空格
\s+
&一个单词字符
\w
后跟行尾
$
。旁注:如果有类似“12A”的门牌号没有空格。然后只需将
\s+
更改为
\s*
\s*
:0或更多空格。这确实是我想要的,也非常感谢您的额外解释。@lukstorm它工作得很好,但究竟是什么部分确保它需要
99
而不是
99框
(别误会我的意思:我希望它能像这样执行,我只是想了解正则表达式是如何只选择带有1个字符的单词的)。@Anonymous因为可选捕获组中的
$
\w
相当于
[a-zA-Z0-9.