修复CHARINDEX查询问题

时间:2018-09-05 12:50:43

标签: sql-server tsql

您好,我正在按照以下查询条件检查值是否为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/8080//80,我想要的是我希望通过第一个查询或第二个查询分别显示这些值。第二个是转换问题,第一个工作正常,但我想知道有没有更好的方法

SQL提琴http://sqlfiddle.com/#!18/45e87/1

同时使用两个查询http://sqlfiddle.com/#!18/45e87/2

2 个答案:

答案 0 :(得分:2)

请尝试以下操作(我改用了您的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;

答案 1 :(得分:1)

我实际上认为您的代码很好,但是由于我喜欢优秀的CTE,因此我将把它丢在这里。您可以尝试比较:

Dog dog = new Dog();

List<Animal> animals = new ArrayList<>();
dog.putInto(animals); // compile error, List<Animal> is not sub type of List<Dog>