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