как мне выбрать часть строки в SQL

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

Итак, я получил длинную строку с данными о продукте, и мне нужен только код EAN.

строка данных выглядит следующим образом:

 {"ArtNr UP":"782001","Omschrijving":"1-2DRY OKSELPADS LARGE WIT","Inhoud":" 20ST","Bruto Inkoop":"2,36","Advies":"4,09","Discount":"4,09","EAN-code CE":"8717775824442","Merkr":"1-2DRYr"}
  

Мне нужно только число, которое идет после EAN-code CE»:», я думал об использовании SUBSTRING, но это не сработает, потому что все записи имеют разную длину.

У кого-нибудь есть идея? заранее спасибо!

Комментарии:

1. Пожалуйста, пометьте свой вопрос базой данных, которую вы используете: mysq, oracle, postgresql …?

Ответ №1:

Не беспокоясь о том, какой движок SQL вы используете, вот алгоритм для его обработки:

  1. Обрезать строку фигурными скобками ( { и } )
  2. Разделить строку по , разделителю
  3. Найдите ту из разделенной таблицы, которая содержит «EAN-Code CE»
  4. Разделите эту часть (если она существует) с помощью : разделителя
  5. Получить вторую часть (если она существует) и обрезать с " помощью .

В результате вы должны получить значение кода EAN.

Ответ №2:

Поскольку номер местоположения EAN имеет фиксированную длину в 13 цифр, нам просто нужен SQL, чтобы найти место, где начинается EAN, а затем отобразить соответствующие данные

Предполагая, что мы используем Mysql, таблица базы данных — «test3», а поле данных, в котором хранится строка данных, — «замечание». В этом случае следующий SQL выполнит эту работу:

 select 
SUBSTRING(remark, locate('EAN-code CE', remark) 14, 13) from test3; 

  

примечание: если вы используете MSSQL, пожалуйста, используйте «CHARINDEX» вместо «locate»

Ответ №3:

Эта строка, подлежащая анализу, является JSON, поэтому в базах данных SQL Server мы можем использовать функцию таблицы OpenJSON

Вот пример кода для переменной string

 declare @str nvarchar(max) = '{"ArtNr UP":"782001","Omschrijving":"1-2DRY OKSELPADS LARGE WIT","Inhoud":" 20ST","Bruto Inkoop":"2,36","Advies":"4,09","Discount":"4,09","EAN-code CE":"8717775824442","Merkr":"1-2DRYr"}'

select * from openJSON(@str) where "key" = 'EAN-code CE'
  

Если вы сохраните эту строку JSON в таблице базы данных, то код можно использовать следующим образом

 select * 
from TableName
cross apply openJSON(str) with (
    "EAN-code CE" varchar(20)
)
  

В этом случае str — это столбец, содержащий данные JSON в TableName table

Вывод выглядит следующим образом введите описание изображения здесь

Вы найдете образцы OpenJSON при разборе JSON с использованием SQL OpenJSON, которые будут полезны, если вам требуется более одного столбца в списке возвращаемых данных

Ответ №4:

Если вы используете SQL Server 2016 (и далее), это, похоже, работает :

 CREATE TABLE TEST(
DUMMY NVARCHAR(MAX));
INSERT INTO TEST(DUMMY) VALUES('{"ArtNr UP":"782001","Omschrijving":"1-2DRY OKSELPADS LARGE WIT","Inhoud":" 20ST","Bruto Inkoop":"2,36","Advies":"4,09","Discount":"4,09","EAN-code CE":"8717775824442","Merkr":"1-2DRYr"}');

SELECT JSON_VALUE(DUMMY,'$."EAN-code CE"') as EANCode
FROM TEST
  

Редактировать :
Поскольку вы используете MySQL, эквивалентом, по-видимому, является оператор ->> :

 CREATE TABLE `JSON_TABLE` (
  `JSON` TEXT DEFAULT NULL
);

INSERT INTO `JSON_TABLE` VALUES ('{"ArtNr UP":"782001","Omschrijving":"1-2DRY OKSELPADS LARGE WIT","Inhoud":" 20ST","Bruto Inkoop":"2,36","Advies":"4,09","Discount":"4,09","EAN-code CE":"8717775824442","Merk\r":"1-2DRY\r"}');

SELECT JSON->>'$."EAN-code CE"' FROM `JSON_TABLE`;