我想在firebird数据库中列出没有以“_BI”结尾的系统的触发器, 但没有结果
select * from rdb$triggers
where
rdb$trigger_source is not null
and (coalesce(rdb$system_flag,0) = 0)
and (rdb$trigger_source not starting with 'CHECK' )
and (rdb$trigger_name like '%BI')
但是使用这种语法,它给了我一个“_bi”和“_BI0U”和“_BI0U”结束结果
and (rdb$trigger_name like '%BI%')
但是使用这种语法它会给我null结果 和(rdb $ trigger_name,如'%@ _ BI')
事先谢谢
答案 0 :(得分:1)
问题是Firebird系统表使用CHAR(31)
作为对象名称,这意味着它们用空格填充,直到声明的长度。因此,使用like '%BI'
)不会产生结果,除非BI是第30和第31个字符。
有几种解决方案
例如,您可以在检查
之前修剪名称trim(rdb$trigger_name) like '%BI'
或者您可以要求名称后跟至少一个空格
rdb$trigger_name || ' ' like '%BI %'
在相关说明中,如果您想检查您的触发器名称是否以_BI
结尾,那么您还应该在您的条件中包含下划线。由于like
中的下划线是单个字符匹配器,因此您需要将其转义:
trim(rdb$trigger_name) like '%\_BI' escape '\'
或者您也可以尝试使用正则表达式,因为您不需要修剪或以其他方式破坏表达式的左侧:
rdb$trigger_name similar to '%\_BI[[:SPACE:]]*' escape '\'