前言
DBeaver 是一个免费开源的通用数据库工具,其中22版本的推出了一个虚拟列、虚拟唯一键、虚拟外键、虚拟引用。真是一大神器,本篇就是简单唠叨一下”虚拟列“,”虚拟外键“的简单使用。
使用场景
虚拟列(virtual column )
虚拟列可以使用表达式在数据查看器中看到结果值,不能用于sql查询,因为它不在数据库中。
表达式目前使用的是 jexl3
引擎进行解析,所以我们可以尽情的写表达式去处理我们的列转为需要输出的列。
可以用在运维场景:数据项翻译(1男2女;0未审核1一审2二审3退回4通过…),同一张表提供数据列的指标计算(销售价格÷利润=市盈率)
虚拟外键(virtual foreign key)
虚拟外键的使用我觉得就是为 ER 图查看器准备的,当定义完虚拟外键后,就可以看到 ER 图查看器中关联其他表的 ER 图,基于已经存在的数据库,想整理一个 ER 图,那可比 PDMan 方便多了
DBeaver的虚拟主键和虚拟外键这些都是为了丰富自身产品的功能引入的,都是在功能上使用的(ER图、表格展示数据、构造SQL脚本…),与数据库无关。举个例子:如查询一个无主键的表后在展示的数据列表修改一条数据,原本该软件构造的SQL根据表没有主键所以where语句后需要跟上全部的字段,在设置虚拟主键后where条件就只有虚拟主键的那个字段作为条件。
虚拟列可用方法概览
jexl操作符
一种是默认的 jexl3 操作符号,其使用方式可以直接是 操作符, 也可以使用对应的方法进行调用。
操作符 | 描述 |
---|---|
布尔值and | 可以使用常用的&& 运算符以及单词and ,例如 cond1 and cond2 和 cond1 && cond2 是等价的。注意这个运算符不能重载 |
布尔值or | 可以使用常用的|| 运算符以及单词or ,例如 cond1 or cond2 和 cond1 || cond2 是等价的。注意这个运算符不能重载 |
布尔值not | 可以使用常用的! 运算符以及单词not ,例如 !cond1 和 not cond1 是等价的。注意这个运算符不能重载 |
按位and | & 使用 通常的运算符,例如33 & 4 0010 0001 & 0000 0100 = 0。 |
按位or | | 使用 通常的运算符,例如33 | 4 0010 0001 | 0000 0100 = 0010 0101 = 37。 |
按位xor | ^ 使用 通常的运算符,33 ^ 4 例如 0010 0001 ^ 0000 0100 = 0010 0100 = 37。 |
按位complement | ~ 使用 通常的运算符,例如~33 ,~0010 0001 = 1101 1110 = -34。 |
三元条件?: | 可以使用通常的三元条件运算符condition ? if_true : if_false 运算符以及value ?: if_false 返回value 如果其评估已定义、非空和非假的缩写,例如 val1 ? val1 : val2 和 val1 ?: val2 是等价的。**注意:**条件将评估为何false 时引用未定义的变量或null 所有JexlEngine 标志组合。这允许显式语法宽松,并在所有情况下以相同方式处理条件“if undefined or null or false”。注意这个运算符不能重载 |
空合并运算符?? | 空合并运算符返回其第一个操作数的结果(如果它已定义且不为空)。当x 和y 为 null 或未定义时, x ?? 'unknown or null x' 计算 'unknown or null x' y ?? "default" 结果为 "default" 。当var x = 42 和 时 var y = "forty-two" ,x??"other" 计算为42 并y??"other" 计算为"forty-two" 。**注意:**此运算符的行为不像三元条件,因为它不会将第一个参数强制为布尔值来评估条件。当var x = false 和 时 var y = 0 ,x??true 计算为false 并y??1 计算为0 。注意这个运算符不能重载 |
== | 可以使用常用的== 运算符和缩写eq 。例如 val1 == val2 和 val1 eq val2 是等价的。null 永远只等于 null,也就是说,如果将 null 与任何非 null 值进行比较,则结果为 false。相等使用javaequals 方法 |
!= | 可以使用常用的!= 运算符和缩写ne 。例如 val1 != val2 和 val1 ne val2 是等价的。 |
小于< | 可以使用常用的< 运算符和缩写lt 。例如 val1 < val2 和 val1 lt val2 是等价的。 |
小于或等于<= | 可以使用常用的<= 运算符和缩写le 。例如 val1 <= val2 和 val1 le val2 是等价的。 |
大于> | 可以使用常用的> 运算符和缩写gt 。例如 val1 > val2 和 val1 gt val2 是等价的。 |
大于或等于 | 可以使用常用的>= 运算符和缩写ge 。例如 val1 >= val2 和 val1 ge val2 是等价的。 |
在或匹配=~ | 语法上受 Perl 启发的=~ 运算符可用于检查 a 是否string 匹配正则表达式(表示为 Java String 或 java.util.regex.Pattern)。例如 "abcdef" =~ "abc.* 退货true 。它还检查任何集合、集合或映射(在键上)是否包含值;在这种情况下,它表现为“in”运算符。请注意,公开公共“包含”方法的数组和用户类将允许它们的实例充当此运算符的右侧操作数。 "a" =~ ["a","b","c","d","e",f"] 回报true 。 |
不在或不匹配!~ | 语法上受 Perl 启发的!~ 运算符可用于检查 a 是否string 与正则表达式(表示为 Java String 或 java.util.regex.Pattern)不匹配。例如 "abcdef" !~ "abc.* 退货false 。它还会检查任何集合、集合或映射(在键上)是否不包含值;在这种情况下,它表现为“不在”运算符。请注意,公开公共“包含”方法的数组和用户类将允许它们的实例充当此运算符的右侧操作数。 "a" !~ ["a","b","c","d","e",f"] 回报true 。 |
以…开始=^ | 该=^ 运算符是“startsWith”方法的简写。例如,"abcdef" =^ "abc" 返回true . 请注意,通过 duck-typing,公开公共“startsWith”方法的用户类将允许其实例充当此运算符的左侧操作数。 |
不是开始于!^ | 这是“startsWith”运算符的否定。 a !^ "abc" 相当于!(a =^ "abc") |
以…结束=$ | 该=$ 运算符是“endsWith”方法的简写。例如,"abcdef" =$ "def" 返回true . 请注意,通过 duck-typing,公开“endsWith”方法的用户类将允许其实例充当此运算符的左侧操作数。 |
不结束于!$ | 这是“结尾为”运算符的否定。 a !$ "abc" 相当于!(a =$ "abc") |
添加+ | + 使用 通常的运算符。例如 val1 + val2 |
减法- | - 使用 通常的运算符。例如 val1 - val2 |
乘法* | * 使用 通常的运算符。例如 val1 * val2 |
除法/ | 使用通常的/ 运算符,或者可以使用div 运算符。例如 val1 / val2 或 val1 div val2 |
取模(或余数)% | % 使用运算符 。另一种选择是mod 运营商。例如 5 mod 2 给出 1 等同于5 % 2 |
复合运算符 | 一些运算符以副作用的形式存在。它们的默认行为是执行运算符并将结果分配给左侧。例如a += 2 相当于a = a + 2 运算符列表是:+= 、-= 、*= 、/= 、%= 、&= 、|= 、^= |
否定 | 使用 一元运算符- 。它更改其数字参数的符号。例如-12 或-(a * b) |
提升字段类型 | + 使用 一元运算符。它执行整数提升,这意味着 byte、short、char 参数将因此提升为整数。例如 +12 或-(a * b) |
空empty | 一元empty 运算符的行为与相应的函数完全相同empty() 。例如empty arg 和empty(arg) 是等价的 |
size | 一元size 运算符的行为与相应的函数完全相同size() 。例如size [1,2,3] 和size([1,2,3]) 是等价的 |
String常用操作方法
String的常用操作方法,只能直接进行调用: 比如字段 ID
是字符串类型,使用的时候可以直接使用如下方法: ID.length()
、ID.charAt(4)
、ID.equals('name')
方法名 | 方法含义 |
---|---|
length | 求字符串的长度 |
charAt(int index) | 求字符串某一位置字符 |
substring(int beginIndex) | 提取子串 |
compareTo(String anotherString) | 字符串比较 |
compareToIgnore(String anotherString) | 字符串比较-忽略大小写 |
equals(Object anotherObject) | 比较当前字符串和参数字符串 |
equalsIgnoreCase(String anotherString) | 比较-忽略大小写 |
concat(String str) | 字符串连接,等价于“+ ” |
indexOf(int ch/String str) | 查找当前字符串中字符或子串 |
indexOf(int ch/String str, int fromIndex) | 从fromIndex位置向后查找当前字符串中字符或子串 |
lastIndexOf(int ch/String str) | 从后向前查找当前字符串中字符或子串 |
lastIndexOf(int ch/String str, int fromIndex) | 从fromIndex位置向前查找当前字符串中字符或子串 |
toLowerCase() | 当前字符串中所有字符转换成小写后的新串 |
toUpperCase() | 将当前字符串中所有字符转换成大写后的新串 |
replace(char oldChar, char newChar) | 用字符newChar 替换当前字符串中所有的oldChar字符 |
replaceFirst(String regex, String replacement) | 用字符replacement 的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串 |
replaceAll(String regex, String replacement) | 用字符replacement 的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串 |
trim | 忽略字符串前导和尾部的空格 |
isEmpty() | 判断字符串是否为空 |
contains(String str) | 判断是否包含指定的字符串 |
startsWith(String prefix) | 此字符串是否以指定的子串开始 |
endsWith(String prefix) | 此字符串是否以指定的子串结束 |