【发布时间】:2020-02-10 05:31:13
【问题描述】:
我有一个表 tbl1 有两列 col1 和 col2 包含字符串:
col1 | col2
--------+--------
bar | foo
foo | foobar
bar1foo | bar2foo
对应的SQL转储:
CREATE TABLE `tbl1` (
`col1` varchar(20) COLLATE latin1_general_ci NOT NULL,
`col2` varchar(20) COLLATE latin1_general_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
INSERT INTO `tbl1` (`col1`, `col2`) VALUES
('bar', 'foo'),
('foo', 'foobar'),
('bar1foo', 'bar2foo');
在大多数情况下,条目的字符串共享一个公共前缀。我需要一个去除那些常见前缀的查询。预期结果:
bar | foo
| bar
1foo | 2foo
到目前为止我的方法:
SELECT
SUBSTR(`col1`, 1+GREATEST(LENGTH(`col1`), LENGTH(`col2`)) - CEIL(LENGTH(TRIM(TRAILING '0' FROM HEX(ABS(CONV(HEX(REVERSE(`col1`)),16,10) - CONV(HEX(REVERSE(`col2`)),16,10)))))/2)),
SUBSTR(`col2`, 1+GREATEST(LENGTH(`col1`), LENGTH(`col2`)) - CEIL(LENGTH(TRIM(TRAILING '0' FROM HEX(ABS(CONV(HEX(REVERSE(`col1`)),16,10) - CONV(HEX(REVERSE(`col2`)),16,10)))))/2))
FROM tbl1
简短说明:字符串取反(REVERSE),转换成整数(HEX和CONV),相互相减(-和ABS),转换成十六进制表示(@987654333 @), 0's 从末尾修剪 (TRIM),从最长字符串的长度 (-, LENGTH 和 GREATEST) 中减去此结果的长度,然后由SUBSTR 获取结果。
我的方法存在问题:
- 不适用于长度超过 64 位的字符串。
- 不适用于包含多字节字符的字符串
- 又长又丑
- 性能不佳。
【问题讨论】:
-
这不是sql擅长的。只是说'