выберите записи, где регулярное выражение равно другому столбцу - PullRequest
0 голосов
/ 19 марта 2020

У меня есть таблица с целыми числами в столбце A и строки в столбце B, например:

+---------+-----------------+
| columnA | columnB         | 
+---------+-----------------+
| 32      | 1,8,12,32       | <--
| 16      | 1,1,2,9,2,7     | 
| 321     | 3,10,56,111,321 | <--
+---------+-----------------+

Есть ли простой способ выбрать строки, где columnB заканчивается значением из columnA?

Ответы [ 3 ]

1 голос
/ 20 марта 2020

Я согласен с послушанием Гордона против сохранения списка таким образом.

FIND_IN_SET() проверяет, есть ли целое число где-либо в списке.

RIGHT() не будет проверять подходящее граница. Таким образом, «21» будет соответствовать «3,10,56,111,321». Насколько я понимаю, вопрос должен соответствовать только «321».

RIGHT(), плюс префикс «,», «321» будет соответствовать «3,10,56,111,321», но не с «321» .

До 8.0 "[[: <:]] 321 $" мог быть сконструирован для использования в качестве регулярного выражения, и <code>\\b нельзя использовать.

MySQL 8.0 не хотелось бы приведенное выше регулярное выражение, но можно использовать "\\b321$".

Итак ...

План A: Объединить некоторые из приведенных выше тестов и надеяться, что вы не пропустили краевой случай.

План Б: Сделайте так, как предложил Гордон: исправьте схему.

ОК, думаю, это может быть самое короткое:

WHERE SUBSTRING_INDEX(colB, ',', -1) = colA

mysql> SELECT SUBSTRING_INDEX('321', ',', -1) = '321';
+-----------------------------------------+
| SUBSTRING_INDEX('321', ',', -1) = '321' |
+-----------------------------------------+
|                                       1 |
+-----------------------------------------+
+----------------------------------------+
| SUBSTRING_INDEX('321', ',', -1) = '21' |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
+-------------------------------------------+
| SUBSTRING_INDEX('7,321', ',', -1) = '321' |
+-------------------------------------------+
|                                         1 |
+-------------------------------------------+
+----------------------------------------------+
| SUBSTRING_INDEX('7,321,11', ',', -1) = '321' |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
0 голосов
/ 19 марта 2020

Вы должны исправить свою модель данных! Не храните числа в виде строк! Не храните несколько значений в строковом столбце!

Тем не менее, иногда мы застряли с другими людьми, действительно, очень плохими решениями. MySQL имеет полезную функцию, find_in_set() для этого случая:

where find_in_set(columnA, columnB) > 0
0 голосов
/ 19 марта 2020

При написании этого вопроса я получил представление об ответчике, использующем конкатенацию.

SELECT * FROM myTable t WHERE columnB REGEXP CONCAT(t.columnA, '$');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...