我在notepad ++上逐行编写了数千个SQL查询。单行包含一个SQL查询。每个SQL查询都包含将从数据库中选择的列列表作为逗号分隔的值。现在我们希望某些列不成为其中的一部分遵循特定模式/正则表达式的列表。SQL查询遵循特定模式:
有时候我们想要删除的模式既存在于PK / where中,也存在于PK / where中。我们不想从那些位置删除该列/模式,只需从列选择列表中删除。
下面是一个SQL查询的示例:
select (TRIM(TAE_TSP_REC_UPDATE)) as PK,TAE_AMT_FAIR_MV,TAE_TXT_ACCT_NUM,TAE_CDE_OWNER_TYPE,TAE_DTE_AQA_ABA,TAE_RID_OWNER,TAE_FID_OWNER,TAE_CID_OWNER,TAE_TSP_REC_UPDATE from TABLE_TAX_REP where DATE(TAE_TSP_REC_UPDATE)>='03/31/2018'
删除列/模式后,查询应如下所示:
select (TRIM(TAE_TSP_REC_UPDATE)) as PK,TAE_AMT_FAIR_MV,TAE_TXT_ACCT_NUM,TAE_CDE_OWNER_TYPE,TAE_DTE_AQA_ABA from TABLE_TAX_REP where DATE(TAE_TSP_REC_UPDATE)>='03/31/2018'
想要从逗号之间的每个查询中删除以下模式:
如果该模式存在于TRIM / DATE函数中,则不应对其进行触摸。应仅从列选择列表中将其删除。 关于上述内容,有人可以帮我吗。谢谢!
答案 0 :(得分:1)
您可以使用
(?:\G(?!^)|\sas\s(?=.*'\d{2}/\d{2}/\d{4}'$))(?:(?!\sfrom\s).)*?\K,?\s*[A-Z_]+_(?:[FRC]ID|TSP)_[A-Z_]+
详细信息
(?:\G(?!^)|\sas\s(?=.*'\d{2}/\d{2}/\d{4}'$))
-两种选择:
\G(?!^)
-上一个位置的末尾,而不是行首的位置|
-或\sas\s(?=.*'\d{2}/\d{2}/\d{4}'$)
-由单个空格包围的as
,后跟除换行符之外的任何0+字符,然后是'
,2位数字,/
,2数字/
,4位数字和'
位于行尾(?:(?!\sfrom\s).)*?
-消耗除换行符以外的任何char,0个或多个重复(尽可能少),这些字符不会开始空白,from
,空白序列\K
-匹配重置运算符,舍弃到目前为止已匹配的所有文本,?\s*
-可选逗号,后跟0+个空格[A-Z_]+_(?:[FRC]ID|TSP)_[A-Z_]+
-ASCII字母或/和_
,出现1次或多次,后跟_
,然后依次是F
,R
或{{1} },后跟C
或ID
,然后是TSP
,再出现1次或多次出现的ASCII字母或/和_
。请参见regex demo。