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'在字段中)
afterelse
必须删除,这样才能真正起作用。然而,它只适用于检测“盒子”,一旦它是其他东西,它就无法工作。但这是我的错,因为我没有提出问题和可能性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.
。