我正在使用BigQuery,我想在特定的匹配字符串之后提取字符串,在我的情况下,字符串为sc
我有一个像这样的字符串:
www.xxss.com?psct=T-EST2%20.coms&.com/u[sc'sc(mascscin', sc'.c(scscossccnfiscg.scjs']-/ci=1(sctitis)
我的预期结果是:
titis)
这可能吗?
答案 0 :(得分:0)
通常,在所有RDBMS中,通过首先反转字符串,很容易计算出字符串中 last 实例的索引。那么我们只在寻找 first 匹配项。
按照String Functions documentation for BigQuery中的
REGEXP_EXTRACT
文档注意: BigQuery使用re2库提供了正则表达式支持;有关正则表达式语法,请参见该文档。
但是,没有RegEx可以解决此问题。
BigQuery支持数组处理并具有SPLIT
函数,因此您可以按查找变量拆分并仅捕获最后一个结果:
SELECT ARRAY_REVERSE(SPLIT( !YOUR COLUMN HERE! , "sc"))[OFFSET(1)]
我原始提交的以下内容可能仍然有效:
SELECT REVERSE(SUBSTR(REVERSE(@text), 1, STRPOS(REVERSE(@text), "cs") -1))
对于那些在MS SQL Server中有类似要求的人,可以使用以下语法。
其他RDBMS可以使用类似的查询,您将必须使用适当的平台函数来获得结果。
DECLARE @text varchar(200) = 'www.xxss.com?psct=T-EST2%20.coms&.com/u[sc''sc(mascscin'', sc''.c(scscossccnfiscg.scjs'']-/ci=1(sctitis)'
SELECT REVERSE(LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1))
产生:titis)
您可以通过获取上述'sc'的最后一个 index 并在
SUBSTRING
中使用该值来获得相似的结果,但要重新工作,长度,此解决方案改为使用LEFT
函数,然后使用REVERSE
作为结果,从而将查询的功能复杂度降低1(减少1个函数调用)
逐步执行以下操作:
取反值:
SELECT REVERSE(@text)
结果:
)sititcs(1=ic/-]'sjcs.gcsifnccssocscs(c.'cs ,'nicscsam(cs'cs[u/moc.&smoc.02%2TSE-T=tcsp?moc.ssxx.www
现在我们找到'cs'
的 first 索引
注意:我们还必须逆转查找字符串的顺序!
SELECT CharIndex('cs', REVERSE(@text),1)
结果:7
选择此索引之前的字符:
注意:我们必须在此处使用-1
,因为SQL使用CharIndex的基于1的索引结果,因此我们必须将其减少1
SELECT LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1)
最后,我们反转结果:
SELECT REVERSE(LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1))
答案 1 :(得分:-2)
猜想您可以使用'sc'作为分隔符,在查询(通配符)中定义(如果字符串长度不变)字符串长度,
@Repository
public interface EmployeeAddressRepository extends JpaRepository<EmployeeAddress, Integer> {
@Query("select empAdd from EmployeeAddress empAdd where empAdd.Employee.employeeId=?1 and (endDate) ORDER BY empAdd.lastUpdateTimeStamp DESC")
List<EmployeeAddress> findEmployeeAddressByEmployeeId(String employeeId, LocalDate date) throws PersistenceException;
}