У меня есть записи в одном из столбцов MySQL DB:
ID Tax
1 GST + PST + ABC
2 PST + GST + ABC
3 XYZ
4 PST + ABC + GST
Они хранятся как varchar в БД. Через мой код мне нужно получить записи из БД, которые соответствуют условию типа tax = "GST + PST + ABC"
В настоящее время я получаю только первую запись из-за запроса:
Select * from table where taxes = "GST + PST + ABC";
Но я хочу получить все записи из БД, в которых выше 3 имен (GST, PST, ABC) будут происходить независимо от их позиций.
Итак, мне нужны записи, если я применяю выше условие:
GST + PST + ABC
PST + GST + ABC
PST + ABC + GST
Я использую MySQL DB, пожалуйста, дайте мне знать, есть ли какая-либо функция, благодаря которой я могу достичь результатов, основанных на моем состоянии
Я бы предложил что-то вроде этого:
where taxes like '%GST%' and
taxes like '%PST%' and
taxes like '%ABC%' and
length(taxes) = 15;
Это проверяет длину, если вы хотите точно эти три кода. Вы также можете проверить количество +
:
where taxes like '%+%+%' and taxes not like '%+%+%+%'
Или, если вы хотите, чтобы эти коды и другие, тогда оставьте эти условия.
Это предполагает, что имена не пересекаются (поэтому нет налога под названием "GS" или "ST"). Если это возможно:
where concat(' ', taxes, ' ') like '% GST %' and
concat(' ', taxes, ' ') like '% PST %' and
concat(' ', taxes, ' ') like '% ABC %';
taxes = 'FOO + PST + GST + ABC + BAR'
. (Мы могли бы добавить AND taxes NOT LIKE '%+%+%+%'
чтобы исключить строки, имеющие более двух знаков плюс.)
я хотел бы использовать
WHERE NAME REGEXP "GST"
AND NAME REGEXP "PST"
AND NAME REGEXP "ABC"
Сказав это, это звучит как случай, когда ваша модель данных недостаточно нормализована. То есть вы должны хранить каждый тип налога в отдельной строке, что упростит операции MySQL (как в этом случае). Неправильная практика хранения данных в том виде, который у вас есть. Я бы попытался сохранить его таким образом:
ID ID-sub TAX
-- ------ ---
1 1 GST
1 2 PST
1 3 ABC
2 1 PST
2 2 GST
ID-sub может вообще не понадобиться.
Вы можете использовать OR
SELECT * FROM TABLE WHERE TAXES = "GST + PST + ABC"
OR TAXES = "GST + ABC + PST"
OR TAXES = "PST + GST + ABC"
OR TAXES = "PST + ABC + GST"
OR TAXES = "ABC + GST + PST"
OR TAXES = "ABC + PST + ABC"
Это довольно маленький список вещей, которые могут быть, поэтому я не вижу причин, чтобы усложнить динамическое создание сложного SQL.
Если данные могут быть в других форматах, и вы хотите соответствовать следующим образом: "GST + ABC + PST + ZZZ"
мы могли бы сделать некоторую работу, используя LIKE
AND %
OR
как указано выше. Вы можете попытаться динамически создать SQL, который вам нужен, но это будет сложнее поддерживать, я думаю :)