Как получить число, в котором есть «/» - PullRequest
0 голосов
/ 11 апреля 2019

Я пишу SQL-запрос для извлечения значения из термина столбца, который находится в таблице альфа, и содержит символ "/".У меня есть такие значения, как:

300/500/100
25/50/15
300/500
100/300
25/50/15
100/300
25000/50000
100/300
100/300
25/50/15
100/300/100
300/500/100
300/500/300
25/50/15
25000/50000
100/300

Вывод должен быть

300/500
100/300
100/300
100/300
25000/50000

Он не должен включать любое число с двойным "/" в нем.

Я пытаюсьиспользовать следующий запрос для извлечения точного результата

Мой подход 1:

Select term from alpha where 
term like '%[0-9]/[0-9]%'

Мой подход 2

Select term from alpha where    (CASE 
        WHEN term Like '%/%' THEN Left(term, CHARINDEX('/', term)-1)
        Else term
        End 

Но я не получаю точный результат при выполненииподход 1. Я получаю ошибку в подходе 2. Пожалуйста, помогите мне разобраться в проблеме

Ответы [ 4 ]

5 голосов
/ 11 апреля 2019

Попробуйте это:

select term from alpha 
where term like '%/%' -- >= one '/'
and term not like '%/%/%' -- < two '/'
3 голосов
/ 11 апреля 2019

Подобно другим подходам, этот подход просто получает термин, который имеет по крайней мере 1 /, а затем дополнительно ограничивает результаты тем, у которого нет 2 /.

Смотрите пример здесь: https://rextester.com/LQI52271

create table alpha (
    term varchar(100)
);

insert into alpha values
('300/500/100')
,('25/50/15')
,('300/500')
,('100/300')
,('25/50/15')
,('100/300')
,('25000/50000')
,('100/300')
,('100/300')
,('25/50/15')
,('100/300/100')
,('300/500/100')
,('300/500/300')
,('25/50/15')
,('25000/50000')
,('100/300');

select term
from alpha
where term like '%/%'
    and len(REPLACE(term, '/', '')) = len(term) - 1
order by term;

OUTPUT

Обратите внимание, что вывод отличается от вашего. В вашем входе действительно 5 экземпляров 100/300.

    term
1   100/300
2   100/300
3   100/300
4   100/300
5   100/300
6   25000/50000
7   25000/50000
8   300/500
1 голос
/ 11 апреля 2019

Одним из возможных подходов является подсчет числа / char и выбор только строк с количеством, равным 1:

Input

CREATE TABLE #alpha (
   term varchar(50)
)
INSERT INTO #alpha
   (term)
VALUES
   ('300/500/100'),
   ('25/50/15'),
   ('300/500'),
   ('100/300'),
   ('25/50/15'),
   ('100/300'),
   ('25000/50000'),
   ('100/300'),
   ('100/300'),
   ('25/50/15'),
   ('100/300/100'),
   ('300/500/100'),
   ('300/500/300'),
   ('25/50/15'),
   ('25000/50000'),
   ('100/300')

Заявление

SELECT term 
FROM #alpha
WHERE 
   (term LIKE '%/%') AND
   (LEN(term) - LEN(REPLACE(term, '/', ''))) = 1 

выход

--------------
term
--------------
300/500
100/300
100/300
25000/50000
100/300
100/300
25000/50000
100/300
0 голосов
/ 11 апреля 2019

Другой вариант (просто для удовольствия) - использовать тип данных hierarchyid

Пример

 Select *
  From  alpha
  Where try_convert(hierarchyid,'/'+term+'/').GetLevel() = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...