我的pl / sql语句有问题。
这是一个很好的工作选择声明:
SELECT P.DAYS FROM PLPLANPEAKPROGRAM P WHERE P.ID = 1060;
返回; 1,2,3(varchar2)
主sql在这里:
SELECT *
from FIFLIGHTS
LEFT JOIN PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') IN (SELECT P.DAYS
FROM PLPLANPEAKPROGRAM P
WHERE P.ID = 1060) ;
但这不会返回任何结果。
此上面的内容也很好;
SELECT *
from FIFLIGHTS
LEFT JOIN PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = LPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') IN (1,2,3);
有什么问题和解决方案,请帮帮忙?
答案 0 :(得分:2)
你这么说:
SELECT P.DAYS
FROM PLPLANPEAKPROGRAM P
WHERE P.ID = 1060;
返回1,2,3
。这意味着它返回一个字符串值。不是包含三个元素的列表。 to_char()
函数调用返回单个值,例如1
或2
。没有逗号,所以这些都不匹配。
这是一种糟糕的数据格式。您应该存储每行一个元素的列表。 SQL提供了一种非常强大的存储列表的方法,称为表。也就是说,您可以使用exists
:
SELECT *
from FIFLIGHTS LEFT JOIN
PLPLANPEAKPROGRAMCOPY
ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE EXISTS (SELECT 1
FROM PLPLANPEAKPROGRAM P
WHERE P.ID = 1060 and
P.DAYS LIKE '%' || TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') || '%'
);
答案 1 :(得分:0)
SELECT * from FIFLIGHTS LEFT JOIN
PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D')
IN (SELECT P.DAYS FROM PLPLANPEAKPROGRAM P WHERE P.ID = '1060') ;
为您的参数'1060'