- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有两个表:
项目
CREATE TABLE items (
ID int,
TXT string,
CODE string
);
INSERT INTO items VALUES (1,'AA BB CC','ZZ-100');
INSERT INTO items VALUES (2,'BB CC DD','ZZ-200');
INSERT INTO items VALUES (3,'AA CC EE','ZZ-300');
INSERT INTO items VALUES (4,'EE FF GG','ZZ-400');
INSERT INTO items VALUES (5,'CC HH II','ZZ-500');
+----+----------+--------+
| id | txt | code |
+----+----------+--------+
| 1 | AA BB CC | ZZ-100 |
| 2 | BB CC DD | ZZ-200 |
| 3 | AA CC EE | ZZ-300 |
| 4 | EE FF GG | ZZ-400 |
| 5 | CC HH II | ZZ-500 |
+----+----------+--------+
和regex_table:
CREATE TABLE regex_table (
ID int,
REGEXSTR string,
CODE string
);
INSERT INTO regex_table VALUES(1,'AA','ZZ-100');
INSERT INTO regex_table VALUES(1,'CC','ZZ-100');
INSERT INTO regex_table VALUES(2,'AA','ZZ-100');
INSERT INTO regex_table VALUES(2,'BB','ZZ-200');
INSERT INTO regex_table VALUES(2,'CC','ZZ-200');
INSERT INTO regex_table VALUES(3,'DD','ZZ-100');
INSERT INTO regex_table VALUES(3,'DD','ZZ-300');
+----+----------+--------+
| id | regexstr | code |
+----+----------+--------+
| 1 | AA | ZZ-100 |
| 1 | CC | ZZ-100 |
| 2 | BB | ZZ-200 |
| 2 | AA | ZZ-100 |
| 2 | CC | ZZ-200 |
| 3 | DD | ZZ-100 |
| 3 | DD | ZZ-300 |
+----+----------+--------+
我想用 regex_table.regexstr
中的搜索字符串替换 items.txt
,具体取决于 id
和 code
是相等的。
例如:
场景 1: 如果 id=1
,code
为 ZZ-100
,因此搜索字符串是 AA|CC
:
SELECT id,regexp_replace(txt,'AA|CC','<NA>'),code from items where id=1;
+----+--------------------------------------+--------+
| id | regexp_replace(txt, 'aa|cc', '<na>') | code |
+----+--------------------------------------+--------+
| 1 | <NA> BB <NA> | ZZ-100 |
+----+--------------------------------------+--------+
场景 2: 如果 id=2
,code
为 ZZ-200
,因此搜索字符串是 BB|CC
:
SELECT id,regexp_replace(txt,'BB|CC','<NA>'),code from items where id=2;
+----+--------------------------------------+--------+
| id | regexp_replace(txt, 'bb|cc', '<na>') | code |
+----+--------------------------------------+--------+
| 2 | <NA> <NA> DD | ZZ-200 |
+----+--------------------------------------+--------+
场景 3: 如果 id=4
,code
为 ZZ-300
,因此搜索字符串是 DD
:
SELECT id,regexp_replace(txt,'DD','<NA>'),code from items where id=3;
+----+-----------------------------------+--------+
| id | regexp_replace(txt, 'dd', '<na>') | code |
+----+-----------------------------------+--------+
| 3 | AA CC EE | ZZ-300 |
+----+-----------------------------------+--------+
所以基本上搜索字符串必须是动态的,具体取决于来自另一个表的 id
和 code
。
有没有办法在 Impala(重要)和 Hive(不太重要)的一个查询中执行此操作?
注意:
id
和code
可以是动态的并添加到两个表中(因此无法硬编码到 SQL 中)。必须查询。
我尽量避免执行JOIN
。我想知道是否有办法进行子查询。
一个想法是传递包含 concat Regex 搜索字符串的完整字符串,然后使用一些 Regex 技巧删除与该行不相关的“id”和“code”。
更新 1
我试过这个:
SELECT i.id, regexp_replace(txt, pattern, '<NA>'), i.code FROM items i INNER JOIN (SELECT id, group_concat('|', regexstr) AS pattern, regex_table.code FROM regex_table GROUP BY regex_table.id, regex_table.code) r ON r.id = i.id AND r.code = i.code;
得到这个:
+----+----------------------------------------------+--------+
| id | regexp_replace(txt, pattern, '<na>') | code |
+----+----------------------------------------------+--------+
| 1 | <NA>A<NA>A<NA> <NA>B<NA>B<NA> <NA> | ZZ-100 |
| 3 | <NA>A<NA>A<NA> <NA>C<NA>C<NA> <NA>E<NA>E<NA> | ZZ-300 |
| 2 | <NA>B<NA>B<NA> <NA> <NA>D<NA>D<NA> | ZZ-200 |
+----+----------------------------------------------+--------+
更新 2
我成功了
SELECT o.id,
o.code,
items.txt,
o.regexstr,
IF(o.regexstr IS NOT NULL, regexp_replace(items.txt, o.regexstr,
'<NA>'), items.txt) masked
FROM items
LEFT JOIN (SELECT i.id id,
i.code code,
group_concat(r.regexstr, '|') regexstr
FROM items i
left join (SELECT id,
regexstr,
regex_table.code
FROM regex_table) r
ON r.id = i.id
AND r.code = i.code
GROUP BY i.id,
i.code) o
ON items.id = o.id
AND items.code = o.code;
输出:
+----+--------+----------+----------+--------------+
| id | code | txt | regexstr | masked |
+----+--------+----------+----------+--------------+
| 5 | ZZ-500 | CC HH II | NULL | CC HH II |
| 2 | ZZ-200 | BB CC DD | BB|CC | <NA> <NA> DD |
| 4 | ZZ-400 | EE FF GG | NULL | EE FF GG |
| 3 | ZZ-300 | AA CC EE | DD | AA CC EE |
| 1 | ZZ-100 | AA BB CC | CC|AA | <NA> BB <NA> |
+----+--------+----------+----------+--------------+
但是看起来比较“复杂”。有没有让它更简洁的想法?
最佳答案
您可以使用 CASE
表达式将所有内容组合在一起:
SELECT
id,
CASE WHEN id = 1 THEN regexp_replace(txt, 'AA|CC', '<NA>')
WHEN id = 2 THEN regexp_replace(txt, 'BB|CC', '<NA>')
WHEN id = 3 THEN regexp_replace(txt, 'DD', '<NA>') END AS output
code
FROM items
WHERE id IN (1, 2, 3);
关于sql - 来自另一个表的动态正则表达式搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51100320/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!