Нужно выбрать строки из MySQL

0

У меня есть записи в одном из столбцов 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, пожалуйста, дайте мне знать, есть ли какая-либо функция, благодаря которой я могу достичь результатов, основанных на моем состоянии

  • 1
    Пусть это будет уроком для правильной нормализации ваших данных.
Теги:

3 ответа

2

Я бы предложил что-то вроде этого:

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 %';
  • 0
    Обратите внимание, что это также вернет строку с taxes = 'FOO + PST + GST + ABC + BAR' . (Мы могли бы добавить AND taxes NOT LIKE '%+%+%+%' чтобы исключить строки, имеющие более двух знаков плюс.)
  • 0
    @ spencer7593. , , Я все еще подозреваю, что ОП действительно означает, по крайней мере, эти три кода, но я думаю, что я читаю это.
1

я хотел бы использовать

  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 может вообще не понадобиться.

1

Вы можете использовать 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 %

  • 0
    Спасибо, я могу использовать это, но есть ли какая-то сокращенная функция, которую я могу использовать, чтобы сделать мой код более читабельным и, как правило, соответствовать стандартам.
  • 0
    Я думаю, потому что есть только 6 возможных комбинаций, которые я бы просто использовал OR как указано выше. Вы можете попытаться динамически создать SQL, который вам нужен, но это будет сложнее поддерживать, я думаю :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню