2017-03-31 61 views
0

假设我有序列号,测试名称和其他几个栏目,我想写一个条件,如果TESTNAME is null特定序列号,然后设置TESTNAME空白否则执行内部联接如果MSSQL else条件

SELECT 
    (A.PTNUMBER + '-' +A.SL_NO) AS ENUMBER, 
    D.ENGINEER AS REQ, D.DATETIME as "DATE", 
    (select Value 
    from DROPDOWN 
    where B.TEST_NAME=CONVERT(VARCHAR,DropdownID)) TESTNAME, 
    TABLE_NAME AS TABLETD 
FROM INSPECTION D 
INNER JOIN TABLEA A ON D.ENGID = CONVERT(VARCHAR,A.EN_ID) 
INNER JOIN TABLEB B ON B.ENGID = CONVERT(VARCHAR,A.EN_ID) 
INNER JOIN TABLEC C ON C.ENGID = CONVERT(VARCHAR,A.EN_ID) 
+1

结帐的情况下的关键字(https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql)向我们展示你到目前为止所拥有的。我们不介意读者:) – Jeremy

+0

下一次,从查询开始。它会阻止无法捕捉问题范围或正确解决问题的答案。假设性问题不是[最小,完整或可验证示例](https://stackoverflow.com/help/mcve)。为了改进您的答案,[请查看此主题](https://stackoverflow.com/help/how-to-ask)并包含测试数据[如此处所述](https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum /)以及预期结果。干杯 – scsimon

回答

0

不知道你组测试名的意思为空白但如果你的意思是使用一个SELECT查询,那么你可以不喜欢

select *, 
case when TESTNAME is null and serial_number = some_value then '' end as TESTNAME 
from mytable 
+0

当B.TEST_NAME为空或B.TEST_NAME ='0',然后'' ,而不是设置TEST_NAME空白,我想设置表D中的另一列'VALUES'到BLANK自 在表D我有一个列(dropdownID)映射到表B中的列(test_name)。 因此,我的目标是当TEST_NAME(在表b中)为0或null时,将值(在表D中)设置为空。 我试过的情况下,当TEST.TEST_NAME IS NULL或TEST.TEST_NAME ='0',然后D.Values ='',但它说不正确的语法。请帮助我。 谢谢。 – Reddy

+0

SELECT(A.PTNUMBER +' - '+ A.SL_NO)AS ENUMBER,D.ENGINEER AS REQ,D.DATETIME as“DATE”,SerialNo = xxx且B.TEST_NAME为空或B的情况。TEST_NAME ='0'then''else(select from DROPDOWN where B.TEST_NAME = CONVERT(VARCHAR,DropdownID))end AS VALUES,TABLE_NAME AS TABLETD FROM INSPECTION D INNER JOIN TABLEA A ON A.ENGID = CONVERT(VARCHAR, A.EN_ID)INNER JOIN TABLEB B ON B.ENGID = CONVERT(VARCHAR,A.EN_ID) INNER JOIN TABLEC C ON C.ENGID = CONVERT(VARCHAR,A.EN_ID) INNER JOIN TABLED D ON D.ENGID = CONVERT (VARCHAR,A.EN_ID); – Reddy

0

您可以结合一个case表达式和coalesce()以及您的连接来选择要返回的值。

select serial_number, ... 
    ,case when coalesce(testname,'') <> '' 
      then t2.testname 
     else coalesce(testname,'') end 
from t 
    inner join t2 
    on ... 

您可以使用isnull()coalesce()在SQL Server返回不同的值来代替null

select isnull(testname,'') 

select coalesce(testname,'') 

这两者之间的主要区别是,coalesce()可以支持多于2个参数,它选择第一一个不是null。两者之间更多的差异answered here.

select coalesce(testname,testname2,'') 

coalesce()也是标准ANSI SQL,所以你会在大多数RDBMS找到它。 isnull()是特定于SQL Server的。

参考:

+0

以下是我的查询,如何将TESTNAME设置为空如果它的NULL并执行连接条件并填充值SELECT(A.PTNUMBER +' - '+ A.SL_NO)AS ENUMBER,D.ENGINEER AS REQ, D.DATETIME作为“DATE”,(从DROPDOWN中选择值,其中B.TEST_NAME = CONVERT(VARCHAR,DropdownID))TESTNAME, TABLE_NAME AS TABLETD FROM INSPECTION D INNER JOIN TABLEA ON ON D.ENGID = CONVERT(VARCHAR,A.EN_ID) INNER JOIN TABLEB B ON B.ENGID = CONVERT(VARCHAR,A.EN_ID) INNER JOIN TABLEC C ON C.ENGID = CONVERT(VARCHAR,A.EN_ID) – Reddy

0
SELECT (A.PTNUMBER + '-' + A.SL_NO) AS ENUMBER, 
     D.ENGINEER AS REQ, 
     D.DATETIME as "DATE", 
     case 
     when SerialNo = xxx and TESTNAME is null then '' 
     else (select Value from DROPDOWN where B.TEST_NAME = CONVERT(VARCHAR, DropdownID)) 
     end AS TESTNAME, 
     TABLE_NAME AS TABLETD 
    FROM INSPECTION D 
    INNER JOIN TABLEA A ON D.ENGID = CONVERT(VARCHAR, A.EN_ID) 
    INNER JOIN TABLEB B ON B.ENGID = CONVERT(VARCHAR, A.EN_ID) 
    INNER JOIN TABLEC C ON C.ENGID = CONVERT(VARCHAR, A.EN_ID); 
+0

我想测试一个TEST_NAME是否为null,然后设置为0为空,但由于TEST_NAME是一个varchar,我的SQL语句不会将null设置为空白,您能帮我解决这个问题吗? – Reddy

+0

这是条件TEST.TEST_NAME IS NULL OR TEST.TEST_NAME ='0'然后'' – Reddy

+0

我不明白你需要什么,对不起。 SELECT(A.PTNUMBER + ' - ' + A.SL_NO)AS ENUMBER, D.ENGINEER AS REQ, D.DATETIME为 “DATE”, 情况 时的SerialNo = xxx和测试名是空值,则 '' 否则(从下拉式铸造(价值为varchar)其中B.TEST_NAME = CONVERT(VARCHAR,DropdownID)) 端AS测试名, TABLE_NAME AS TABLETD 验d INNER JOIN TABLEA A ON D.ENGID = CONVERT(VARCHAR,A. EN_ID) INNER JOIN TABLEB B ON B.ENGID = CONVERT(VARCHAR,A.EN_ID) INNER JOIN TABLEC C ON C.ENGID = CONVERT(VARCHAR,A.EN_ID); – IngoB