Исправить проблемы с запросом CHARINDEX - PullRequest
0 голосов
/ 05 сентября 2018

Привет всем. У меня запрос, как показано ниже, где я проверяю, имеет ли значение значение NULL или пусто

SELECT CASE WHEN LSTR = '' THEN 0 ELSE LSTR END AS left_string, CASE WHEN RSTR = '' THEN 0 ELSE RSTR END AS right_string FROM table
cross apply (
    SELECT
           CAST(LEFT(colsetting, CHARINDEX('/', colsetting) -1) AS INT) LSTR
         , CAST(SUBSTRING(colsetting, CHARINDEX('/', colsetting) +1, 200) AS INT) RSTR
    ) ca1
WHERE
CHARINDEX('/', colsetting)  > 0

Первоначально у меня есть это, но когда я получаю немного conversion error, я написал выше

DECLARE @setting nvarchar(100)='80/ '
SELECT CAST(CAST(SUBSTRING(isnull(@setting,0), 0, CHARINDEX('/',isnull(@setting,0))) AS DECIMAL(3, 0)) AS INT)

SELECT CAST(CAST(SUBSTRING(isnull(@setting,0), CHARINDEX('/',isnull(@setting,0),0) + 1, CHARINDEX('/',isnull(@setting,0),0)) AS DECIMAL(3, 0)) AS INT)

Мои значения настроек могут быть 80/80 или 80/ или /80, когда я выполняю скрипт, мне нужно, чтобы я хотел отображать значения отдельно либо по первому запросу, либо по второму. Второй - проблема конверсии, первый работает нормально, но я хотел бы знать, есть ли лучший подход

SQL скрипка http://sqlfiddle.com/#!18/45e87/1

С обоими запросами http://sqlfiddle.com/#!18/45e87/2

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Пожалуйста, попробуйте это (вместо этого я использовал оригинальное имя таблицы из вашей скрипты sql):

select
     [left_string]  =   convert(int, left([productName], charindex('/', [productName], 0) - 1))
    ,[right_string] =   convert(int, right([productName], charindex('/', reverse([productName]), 0) - 1))   
from [ForgeRock] where charindex('/', [productName]) > 0;
0 голосов
/ 05 сентября 2018

Я на самом деле думаю, что ваш код в порядке, но так как я люблю хороший cte, я выкину его сюда. Вы можете попробовать и сравнить:

WITH CTE AS 
(
     SELECT CAST(LEFT(Productname, CHARINDEX('/', Productname)-1) AS INT) AS Lstr,
            CAST(SUBSTRING(Productname, CHARINDEX('/', Productname)+1, 200) AS INT) AS Rstr
     FROM Forgerock
     WHERE CHARINDEX('/', Productname) > 0
)

SELECT CASE WHEN Lstr = '' THEN 0 ELSE Lstr
       END AS Left_String,
       CASE WHEN Rstr = '' THEN 0 ELSE Rstr
       END AS right_string
FROM CTE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...